Sign in Join
Wiki copytemporary

heaptrc/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11**`heaptrc`** - это модуль, который можно использовать для отладки выделения и освобождения блоков памяти. Он отслеживает вызовы [`getMem`](https://www.freepascal.org/docs-html/rtl/system/getmem.html)/[`freeMem`](https://www.freepascal.org/docs-html/rtl/system/freemem.html) и, неявно, операторы [`new`](https://www.freepascal.org/docs-html/rtl/system/new.html)/[`dispose`](https://www.freepascal.org/docs-html/rtl/system/dispose.html).
22
33> **Warning:**
44
55When a program using heaptrc ends, heaptrc can write out the total memory used and a list of allocated but not freed blocks to a file. When run in the console (*nix or Windows), heaptrc will print this output to screen unless otherwise instructed. In Lazarus GUI programs on Windows, the output will appear in numerous small dialog boxes, which may be very unpractical, although you can redirect output to file.
66
77Когда программа, использующая heaptrc, завершается, heaptrc может записать общий объем используемой памяти и список выделенных, но не освобожденных блоков в файл. При запуске в консоли (*nix или Windows) heaptrc выводит эту информацию на экран, если не указано иное. В программах Lazarus с графическим интерфейсом пользователя в Windows вывод будет отображаться во множестве небольших диалоговых окон, что может быть очень непрактичным, хотя вы можете перенаправить вывод в файл.
88
99![](/wiki-images/7/79/Win_heaptrc_output_no_error.png)
1010
1111В * nix (включая BSD, Linux и macOS) по умолчанию для программ с графическим интерфейсом ничего не отображается (прим.перев.: для вывода в консоль под *nix необходимо подключить окно в разделе View/Debug Window/Console In/Output).\
1212
13-<img src="console_output_win.png" title="Console output window of heaptrc on Linux)|" width="400" alt="Console output window of heaptrc on Linux)|" />\
13+![Console output window of heaptrc on Linux)\|](/wiki-images/2/22/Console_output_win.png)\
1414
1515См. [[leakview/ru|Leakview]] для получения подробной информации о том, как эффективно использовать heaptrc.
1616
1717## Использование
1818
1919### Использование heaptrc в FPC
2020
2121Добавьте параметр `-gh` в командную строку компиляции или в `fpc.cfg`.
2222
2323``` bash
2424fpc -gh helloworld.pas
2525```
2626
2727или обычно в сочетании с информацией о строке:
2828
2929``` bash
3030fpc -glh helloworld.pas
3131```
3232
3333Это добавит heaptrc неявно, как скрытый первый модуль раздела uses программы.
3434
3535Вы можете проверить в коде, активен ли heaptrc, проверив глобальную константу [**`useHeapTrace`**](https://www.freepascal.org/docs-html/rtl/heaptrc/useheaptrace.html) на наличие heaptrc и ее статус следующим образом:
3636
3737``` pascal
3838program possiblyHeaptraced(input, output, stdErr);
3939begin
4040 {$if declared(useHeapTrace)}
4141 writeLn('Heaptrc is used.');
4242 // отчеты heaptrc могут быть отключены при связывании в ... true или false
4343 writeLn('Heaptrc is active: ', useHeaptrace);
4444 // впоследствии вы можете протестировать/задать любые параметры отчетов heaptrc
4545 {$else}
4646 writeLn('No trace of heaptrc.');
4747 {$endIf}
4848end.
4949```
5050
5151Обратите внимание, что `{$if declared(useHeapTrace)}` работает только в программе, а не в модуле.
5252
5353Heaptrc не работает, если вы используете его с FPC 3.0.4 в Linux и ваша программа вызывает функцию `system.get_cmdline`, и в этом случае вы получите в конце программы много сообщений об ошибках EAccessViolation. Это похоже на ошибку, например в FPC 3.2.0-beta rev 43824 эта проблема не возникает.
5454
5555### Использование heaptrc в Lazarus
5656
5757Чтобы включить это в вашем проекте Lazarus:
5858
59591. Идем в раздел Project Options/Compiler Options/Debugging (Параметры проекта/Параметры компилятора/Отладка) и
60602. в разделе Other debugging info (Прочая отладочная информация) включаем *Use Heaptrc unit (check for mem-leaks) (-gh)* (Использовать модуль Heaptrc (проверка на наличие утечек памяти) (-gh))
6161
6262Вы можете проверить наличие `heaptrc` таким же образом, как в приведенном выше примере, проверив наличие `useHeapTrace` в вашем файле project.lpr.
6363
6464``` pascal
6565{$if declared(useHeapTrace)}
6666 // ... что-то делаем
6767
6868 // проверяем активность
6969 if useHeapTrace then
7070 begin
7171 // ...
7272 end;
7373{$endIf}
7474```
7575
7676### Показывать отчет только об утечке
7777
7878Если вы хотите отображать диалоговое окно отчета `heaptrc` только в том случае, если в вашем приложении были утечки, поместите это [[Becomes/ru|присвоение]] где-нибудь в исходный файл основного проекта:
7979
8080``` pascal
8181{$if declared(useHeapTrace)}
8282 globalSkipIfNoLeaks := true; // поддерживается начиная с версии отладчика 3.2.0
8383{$endIf}
8484```
8585
8686### Программное отключение отчета
8787
8888Если вы хотите отключить отчет из своего кода, вы можете напрямую управлять константой `useHeapTrace` при запуске программы:
8989
9090``` pascal
9191useHeapTrace := false;
9292```
9393
9494Это фактически изменит поведение на нормальный менеджер памяти.
9595
9696### Продолжать выполнение даже при ошибке кучи
9797
9898Если вы хотите, чтобы ваше приложение продолжало выполнение даже в случае ошибки кучи, манипулируйте константой [`haltOnError` constant](https://www.freepascal.org/docs-html/rtl/heaptrc/haltonerror.html) при запуске программы:
9999
100100``` pascal
101101haltOnError := false;
102102```
103103
104104### Перенаправление вывода в файл
105105
106106Если вы хотите перенаправить отчет об утечке в файл, добавьте его в начало основного файла проекта:
107107
108108``` pascal
109109setHeapTraceOutput('trace.log'); // поддерживается начиная с версии отладчика 3.2.0
110110```
111111
112112### Почему heaptrc не следует добавлять в раздел uses вручную
113113
114114Никогда не следует добавлять heaptrc вручную в обычную программу, потому что модуль heaptrc должен быть загружен до lineinfo для правильной работы отладки.
115115
116116Для эффективного декодирования отладочной информации dwarf требуется работающий менеджер кучи, а это означает, что heaptrc необходимо загрузить до модуля декодирования dwarf line info, который загружается с помощью -gl, поэтому heaptrc не может использоваться явно.
117117
118118Только сам компилятор может вставить модуль в нужное место в качестве скрытого первого модуля в разделе uses. Добавление модуля вручную может вызвать всевозможные нежелательные побочные эффекты. Например, информациях о сбоях, сообщаемая lineinfo, не является надежной, и не обо всех утечках сообщения будут достоверны.
119119
120120Так было всегда, но правильно задокументировано только в FPC версии 3.0.2. Так что, если вы увидите heaptrc в своем разделе uses, *удалите его!* для правильной работы отладки и отчетов.
121121
122122> **Note:** Если ваша программа предназначена для использования альтернативного менеджера памяти, вы можете адаптировать раздел uses вашей программы следующим образом:
123123>
124124> ``` pascal
125125> program alternativeMemoryManager(input, output, stdErr);
126126> {$mode objFPC}
127127> uses
128128> // Это условно переключит диспетчер памяти
129129> // на основе наличия heaptrc
130130> {$if not declared(useHeapTrace)}
131131> cMem,
132132> {$endIf}
133133> sysUtils, classes; // два последних предназначены для тестирования.
134134>
135135> begin
136136> {$if declared(useHeapTrace)}
137137> writeLn('Heaptrc is used.', ' Heaptrc is active: ', useHeaptrace);
138138> {$else}
139139> writeLn('No trace of heaptrc.');
140140> {$endIf}
141141> end.
142142> ```
143143>
144144> В приведенном выше примере условное выражение в разделе uses гарантирует, что диспетчер памяти cmem компилируется только в том случае, если параметр heaptrc не используется.
145145
146146## См.также
147147
148148- <https://bugs.freepascal.org/view.php?id=30637>
149149- [[leakview/ru|leakview]]: Примеры включения heaptrc в Lazarus и Free Pascal.
150150- [[doc:rtl/heaptrc/|RTL Reference for unit 'heaptrc']] (эта ссылка еще не обновлена)
151151
152152---
153153*From the Free Pascal wiki, page "heaptrc/ru", as it stood on 2022-01-04 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history