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でメモリ リークを検出するにはどうすればよいですか?

4

2 に答える 2

17

Free Pascal にも同様の機能があります。プログラムの最後で、 を呼び出すDumpHeapか、Lazarus プロジェクト設定で heaptrc オプションを有効にします。出力ファイルはメソッドで設定できます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 でテスト済み)

于 2012-10-14T05:51:45.460 に答える
6

mjn は完全に正しく、彼の言うことは好ましい解決策ですが、*nix ではユニット「cmem」(メイン プログラムの最初のユニット) を使用して、メモリ マネージャーを libc の malloc に切り替え、他のデバッグ ツールを使用することもできます。

他のオプションが使い果たされている場合は、これを実行して valgrind を使用する価値があります。valgrind を使用するには、-gv をオンにする必要があることに注意してください。

于 2012-10-14T12:36:38.620 に答える