Delphi 如何检测免费Pascal/Lazarus中的内存泄漏?

Delphi 如何检测免费Pascal/Lazarus中的内存泄漏?,delphi,memory-leaks,freepascal,lazarus,Delphi,Memory Leaks,Freepascal,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

在中,我通常编写一个简单的泄漏测试,如下所示:

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中的内存泄漏具有类似的功能。在程序结束时,调用
DumpHeap
,或在Lazarus项目设置中启用heaptrc选项。可以使用
SetHeapTraceOutput
方法设置输出文件。这两种方法都在单元
heaptrc
中,该单元必须是项目中的第一个(以便从一开始就捕获分配)

更多信息

泄漏可视化:Lazarus包“LeakView”以树状视图显示堆跟踪输出文件的内容。它包含在默认安装中,在重建IDE后可用。(我还没有测试)

输出如下所示:

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
  ...

(使用免费Pascal 2.6.0进行测试)

虽然mjn完全正确,而且他所说的是首选的解决方案,但在*nix上还可以使用单元“cmem”(主程序中的第一个单元)将内存管理器切换到libc的malloc,并使用其他调试工具


如果其他选项已经用尽,那么这样做并使用valgrind是值得的。请注意,要使用valgrind,您需要打开-gv。

可以将FastMM4安装到FPC中,并使用他在Delphi中习惯的调用/变量吗?从未尝试过。我假设没有大量的修改(为回溯符号信息解析调试信息可能完全不同),当然它不依赖于架构。我不知道有人尝试过。目前正在努力将FastMM4移植到FPC中。也许你可以成为其中的一部分。然后,如果FastMM4/FPC是稳定的,您可以不经修改地运行代码。
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
  ...