Как обнаружить утечки памяти в Free Pascal / Lazarus?
на Дельфи, Я обычно пишу простой тест утечки такой:
program MemLeak;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure Leak;
begin
{ Put leaking code here. }
end;
begin
ReportMemoryLeaksOnShutdown:= True;
try
Leak;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Как обнаружить утечки памяти в Бесплатно Паскаль/Лазарь?
2 ответов
Free Pascal имеет аналогичную функцию. В конце программы позвоните DumpHeap
или включите опцию heaptrc в настройках проекта Lazarus. Выходной файл может быть установлен с SetHeapTraceOutput
метод. Оба метода находятся в блоке heaptrc
, который должен быть первым в проекте (для получения ассигнований из начала).
дополнительная информация:
- http://www.freepascal.org/docs-html/rtl/heaptrc/usage.html
- http://www.freepascal.org/docs-html/rtl/heaptrc/environment.html
визуализация утечки: пакет Lazarus "LeakView" представляет содержимое выходного файла трассировки кучи в виде дерева. Он включен в установку по умолчанию и доступен после перестроения среды IDE. (еще не протестировано me)
// By default information is written to standard output,
// this function allows you to redirect the information to a file
SetHeapTraceOutput('heaptrace.log');
// normally the heap dump will be written automatically at the end,
// but can also be written on demand any time
DumpHeap;
вывод выглядит так:
C:\path\to\Demo.exe
Heap dump by heaptrc unit
244 memory blocks allocated : 8305/9080
241 memory blocks freed : 8237/9000
3 unfreed memory blocks : 68
True heap size : 458752
True free heap : 458288
Should be : 458480
Call trace for block 10CE58 size 28
44ACCB TIDTHREADSAFE__CREATE, line 226 of C:/path/to/indy-10.5.8.tiburon/Lib/Core/IdThreadSafe.pas
444245 IDTHREAD_init, line 641 of C:/path/to/indy-10.5.8.tiburon/Lib/Core/IdThread.pas
409D74
40E1A1
...
(протестировано с бесплатным Pascal 2.6.0)
хотя mjn полностью прав, и то, что он говорит, является предпочтительным решением, на *nix можно также использовать блок "cmem" (первый блок в основной программе), чтобы переключить диспетчер памяти на malloc libc и использовать другие инструменты отладки.
Если другие варианты исчерпаны, может быть стоит сделать это и использовать valgrind. Обратите внимание, что для использования valgrind вам нужно включить-gv.