2012-10-14 9 views
12

In Delphi schreibe ich in der Regel eine einfache Dichtigkeitstest wie folgt aus:Wie erkennt man Speicherlecks in 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. 

Wie kann ich erkennen, Speicherlecks in Free Pascal/Lazarus?

+0

Es gibt laufende Bemühungen, FastMM4 in FPC zu portieren. Vielleicht könntest du ein Teil sein. Dann könnten Sie Ihren Code unverändert ausführen, wenn FastMM4/FPC stabil wäre. http://lists.freepascal.org/lists/fpc-pascal/2005-December/009721.html http://lists.freepascal.org/lists/fpc-pascal/2009-June/021448.html –

Antwort

16

Free Pascal hat eine ähnliche Funktion. Rufen Sie am Ende des Programms DumpHeap auf oder aktivieren Sie die Option haptrc in den Lazarus-Projekteinstellungen. Die Ausgabedatei kann mit der Methode SetHeapTraceOutput festgelegt werden. Beide Methoden befinden sich in der Einheit heaptrc, die die erste im Projekt sein muss (um Zuordnungen vom Start zu erfassen).

Weitere Informationen:

Leak Visualisierung: das Lazarus-Paket "LeakView" stellt den Inhalt einer Heap-Trace-Ausgabedatei in einer Baumansicht . Es ist in der Standardinstallation enthalten und nach einer Neuerstellung der IDE verfügbar. (Noch nicht von mir getestet)

// 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; 

Die Ausgabe sieht so aus:

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

(getestet mit Free Pascal 2.6.0)

6

Während mjn ganz richtig ist, und er sagt, was ist die bevorzugte lösung, auf * nix kann man auch die einheit "cmem" (erste einheit im hauptprogramm) verwenden, um den speichermanager auf libc's malloc umzustellen und andere debug-tools zu verwenden.

Wenn andere Optionen erschöpft sind, kann es sich lohnen, dies zu tun und valgrind zu verwenden. Beachten Sie, dass Sie für die Verwendung von Valgrind -gv aktivieren müssen.

+0

kann man einfach Installieren Sie FastMM4 in FPC und verwenden Sie die Anrufe/Vars, an die er sich in Delphi gewöhnt hat? –

+0

Nie probiert. Ich gehe davon aus, nicht ohne schwere Modifikation (Analyse Debug-Informationen für Backtraces symbolische Informationen ist wahrscheinlich völlig anders), und sicherlich ist es nicht architekturabhängig. Ich bin mir nicht bewusst, dass die Leute es sogar versucht haben. –