Подтвердить что ты не робот

Как обнаружить утечки памяти в Free Pascal/Lazarus?

В Delphi я обычно пишу простой тест на утечку следующим образом:

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.

Как обнаружить утечки памяти в Free Pascal/Lazarus?

4b9b3361

Ответ 1

У Free Pascal есть аналогичная функция. В конце программы вызовите DumpHeap или включите параметр heaptrc в настройках проекта Lazarus. Выходной файл можно установить с помощью метода SetHeapTraceOutput. Оба метода находятся в модуле heaptrc, который должен быть первым в проекте (для захвата от начала).

Дополнительная информация:

Визуализация утечки: пакет Lazarus "LeakView" представляет содержимое выходного файла трассировки кучи в древовидном представлении. Он включен в установку по умолчанию и доступен после восстановления IDE. (еще не проверенный мной)

  // 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 $0010CE58 size 28
  $0044ACCB  TIDTHREADSAFE__CREATE,  line 226 of C:/path/to/indy-10.5.8.tiburon/Lib/Core/IdThreadSafe.pas
  $00444245  IDTHREAD_init,  line 641 of C:/path/to/indy-10.5.8.tiburon/Lib/Core/IdThread.pas
  $00409D74
  $0040E1A1
  ...

(протестирован с Free Pascal 2.6.0)

Ответ 2

В то время как mjn полностью прав, и то, что он говорит, является предпочтительным решением, на * nix можно также использовать блок "cmem" (первый блок в основной программе), чтобы переключить диспетчер памяти на libc malloc и использовать другие инструменты отладки.

Если другие варианты исчерпаны, это может быть полезно сделать это и использовать valgrind. Обратите внимание, что для использования valgrind вам необходимо включить -gv.