如何在Free Pascal/Lazarus中检测内存泄漏?

12

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 中检测内存泄漏?


有一个正在进行的工作,将FastMM4移植到FPC中。也许你可以参与其中。如果FastMM4/FPC稳定,那么你就可以运行未经修改的代码。http://lists.freepascal.org/lists/fpc-pascal/2005-December/009721.html http://lists.freepascal.org/lists/fpc-pascal/2009-June/021448.html - Arioch 'The
2个回答

18

Free Pascal有一个类似的功能。在程序结束时,调用DumpHeap或者在Lazarus项目设置中启用heaptrc选项。输出文件可以通过SetHeapTraceOutput方法设置。这两种方法都在unit 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测试)


在Lazarus GUI项目中,你应该在主formcloseoncreate事件中放置SetHeapTraceOutput('heaptrace.log');语句。 - Smith

6

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

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


在FPC中是否可以仅安装FastMM4并使用在Delphi中熟悉的那些调用/变量? - Arioch 'The
从未尝试过。我认为如果不进行大量修改(解析调试信息以获取回溯符号信息可能完全不同),那么肯定不行,而且它肯定不依赖于架构。我不知道有人尝试过。 - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接