Sign in Join
Wiki copytemporary

heaptrc/ru: what changed

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

Title: heaptrc/ru

OldNewLine
1+**`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).
2+
3+> **Warning:**
4+
5+When 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.
6+
7+Когда программа, использующая heaptrc, завершается, heaptrc может записать общий объем используемой памяти и список выделенных, но не освобожденных блоков в файл. При запуске в консоли (*nix или Windows) heaptrc выводит эту информацию на экран, если не указано иное. В программах Lazarus с графическим интерфейсом пользователя в Windows вывод будет отображаться во множестве небольших диалоговых окон, что может быть очень непрактичным, хотя вы можете перенаправить вывод в файл.
8+
9+![](/wiki-images/7/79/Win_heaptrc_output_no_error.png)
10+
11+В * nix (включая BSD, Linux и macOS) по умолчанию для программ с графическим интерфейсом ничего не отображается (прим.перев.: для вывода в консоль под *nix необходимо подключить окно в разделе View/Debug Window/Console In/Output).\
12+
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)|" />\
14+
15+См. [[leakview/ru|Leakview]] для получения подробной информации о том, как эффективно использовать heaptrc.
16+
17+## Использование
18+
19+### Использование heaptrc в FPC
20+
21+Добавьте параметр `-gh` в командную строку компиляции или в `fpc.cfg`.
22+
23+``` bash
24+fpc -gh helloworld.pas
25+```
26+
27+или обычно в сочетании с информацией о строке:
28+
29+``` bash
30+fpc -glh helloworld.pas
31+```
32+
33+Это добавит heaptrc неявно, как скрытый первый модуль раздела uses программы.
34+
35+Вы можете проверить в коде, активен ли heaptrc, проверив глобальную константу [**`useHeapTrace`**](https://www.freepascal.org/docs-html/rtl/heaptrc/useheaptrace.html) на наличие heaptrc и ее статус следующим образом:
36+
37+``` pascal
38+program possiblyHeaptraced(input, output, stdErr);
39+begin
40+ {$if declared(useHeapTrace)}
41+ writeLn('Heaptrc is used.');
42+ // отчеты heaptrc могут быть отключены при связывании в ... true или false
43+ writeLn('Heaptrc is active: ', useHeaptrace);
44+ // впоследствии вы можете протестировать/задать любые параметры отчетов heaptrc
45+ {$else}
46+ writeLn('No trace of heaptrc.');
47+ {$endIf}
48+end.
49+```
50+
51+Обратите внимание, что `{$if declared(useHeapTrace)}` работает только в программе, а не в модуле.
52+
53+Heaptrc не работает, если вы используете его с FPC 3.0.4 в Linux и ваша программа вызывает функцию `system.get_cmdline`, и в этом случае вы получите в конце программы много сообщений об ошибках EAccessViolation. Это похоже на ошибку, например в FPC 3.2.0-beta rev 43824 эта проблема не возникает.
54+
55+### Использование heaptrc в Lazarus
56+
57+Чтобы включить это в вашем проекте Lazarus:
58+
59+1. Идем в раздел Project Options/Compiler Options/Debugging (Параметры проекта/Параметры компилятора/Отладка) и
60+2. в разделе Other debugging info (Прочая отладочная информация) включаем *Use Heaptrc unit (check for mem-leaks) (-gh)* (Использовать модуль Heaptrc (проверка на наличие утечек памяти) (-gh))
61+
62+Вы можете проверить наличие `heaptrc` таким же образом, как в приведенном выше примере, проверив наличие `useHeapTrace` в вашем файле project.lpr.
63+
64+``` pascal
65+{$if declared(useHeapTrace)}
66+ // ... что-то делаем
67+
68+ // проверяем активность
69+ if useHeapTrace then
70+ begin
71+ // ...
72+ end;
73+{$endIf}
74+```
75+
76+### Показывать отчет только об утечке
77+
78+Если вы хотите отображать диалоговое окно отчета `heaptrc` только в том случае, если в вашем приложении были утечки, поместите это [[Becomes/ru|присвоение]] где-нибудь в исходный файл основного проекта:
79+
80+``` pascal
81+{$if declared(useHeapTrace)}
82+ globalSkipIfNoLeaks := true; // поддерживается начиная с версии отладчика 3.2.0
83+{$endIf}
84+```
85+
86+### Программное отключение отчета
87+
88+Если вы хотите отключить отчет из своего кода, вы можете напрямую управлять константой `useHeapTrace` при запуске программы:
89+
90+``` pascal
91+useHeapTrace := false;
92+```
93+
94+Это фактически изменит поведение на нормальный менеджер памяти.
95+
96+### Продолжать выполнение даже при ошибке кучи
97+
98+Если вы хотите, чтобы ваше приложение продолжало выполнение даже в случае ошибки кучи, манипулируйте константой [`haltOnError` constant](https://www.freepascal.org/docs-html/rtl/heaptrc/haltonerror.html) при запуске программы:
99+
100+``` pascal
101+haltOnError := false;
102+```
103+
104+### Перенаправление вывода в файл
105+
106+Если вы хотите перенаправить отчет об утечке в файл, добавьте его в начало основного файла проекта:
107+
108+``` pascal
109+setHeapTraceOutput('trace.log'); // поддерживается начиная с версии отладчика 3.2.0
110+```
111+
112+### Почему heaptrc не следует добавлять в раздел uses вручную
113+
114+Никогда не следует добавлять heaptrc вручную в обычную программу, потому что модуль heaptrc должен быть загружен до lineinfo для правильной работы отладки.
115+
116+Для эффективного декодирования отладочной информации dwarf требуется работающий менеджер кучи, а это означает, что heaptrc необходимо загрузить до модуля декодирования dwarf line info, который загружается с помощью -gl, поэтому heaptrc не может использоваться явно.
117+
118+Только сам компилятор может вставить модуль в нужное место в качестве скрытого первого модуля в разделе uses. Добавление модуля вручную может вызвать всевозможные нежелательные побочные эффекты. Например, информациях о сбоях, сообщаемая lineinfo, не является надежной, и не обо всех утечках сообщения будут достоверны.
119+
120+Так было всегда, но правильно задокументировано только в FPC версии 3.0.2. Так что, если вы увидите heaptrc в своем разделе uses, *удалите его!* для правильной работы отладки и отчетов.
121+
122+> **Note:** Если ваша программа предназначена для использования альтернативного менеджера памяти, вы можете адаптировать раздел uses вашей программы следующим образом:
123+>
124+> ``` pascal
125+> program alternativeMemoryManager(input, output, stdErr);
126+> {$mode objFPC}
127+> uses
128+> // Это условно переключит диспетчер памяти
129+> // на основе наличия heaptrc
130+> {$if not declared(useHeapTrace)}
131+> cMem,
132+> {$endIf}
133+> sysUtils, classes; // два последних предназначены для тестирования.
134+>
135+> begin
136+> {$if declared(useHeapTrace)}
137+> writeLn('Heaptrc is used.', ' Heaptrc is active: ', useHeaptrace);
138+> {$else}
139+> writeLn('No trace of heaptrc.');
140+> {$endIf}
141+> end.
142+> ```
143+>
144+> В приведенном выше примере условное выражение в разделе uses гарантирует, что диспетчер памяти cmem компилируется только в том случае, если параметр heaptrc не используется.
145+
146+## См.также
147+
148+- <https://bugs.freepascal.org/view.php?id=30637>
149+- [[leakview/ru|leakview]]: Примеры включения heaptrc в Lazarus и Free Pascal.
150+- [[doc:rtl/heaptrc/|RTL Reference for unit 'heaptrc']] (эта ссылка еще не обновлена)
151+
152+---
153+*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