2012-10-14 44 views
12

W Delphi, zwykle napisać prosty test szczelności takiego:Jak wykrywać wycieki pamięci w 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. 

jaki sposób wykryć przecieki pamięci w Free Pascal/Lazarus?

+0

Trwają starania, aby przenieść FastMM4 do FPC. Być może mógłbyś być częścią. Wtedy możesz uruchomić ten kod bez modyfikacji, jeśli FastMM4/FPC będzie stabilny. http://lists.freepascal.org/lists/fpc-pascal/2005-December/009721.html http://lists.freepascal.org/lists/fpc-pascal/2009-June/021448.html –

Odpowiedz

16

Darmowy Pascal ma podobną funkcję. Na końcu programu zadzwoń pod numer DumpHeap lub włącz opcję heaptrc w ustawieniach projektu Lazarus. Plik wyjściowy można ustawić za pomocą metody SetHeapTraceOutput. Obie metody znajdują się w jednostce heaptrc, która musi być pierwszą w projekcie (aby przechwytywać przydziały od początku).

Więcej informacji:

Leak wizualizacja: pakiet Lazarus "LeakView" przedstawia zawartość pliku wyjściowego śledzenia sterty w widoku drzewa . Jest on zawarty w domyślnej instalacji i dostępny po przebudowie IDE. (Jeszcze nie testowane przeze mnie)

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

Wyjście wygląda następująco:

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

(testowane z Free Pascal 2.6.0)

6

Podczas MJN jest całkowicie w porządku, a to co mówi jest preferowane rozwiązanie, na * nix można również użyć jednostki "cmem" (pierwsza jednostka w programie głównym), aby przełączyć menedżera pamięci na malloc biblioteki libc i użyć innych narzędzi do debugowania.

Jeśli inne opcje są wyczerpane, warto to zrobić i użyć valgrind. Zauważ, że aby użyć valgrind musisz włączyć -gv.

+0

może po prostu zainstalować FastMM4 w FPC i wykorzystać te połączenia/vary, do których przywykł w Delphi? –

+0

Nigdy nie próbowałem. Zakładam, że nie bez ciężkich modyfikacji (parsowanie informacji debugowania dla informacji zwrotnych, symbolicznych informacji jest prawdopodobnie zupełnie inne) i na pewno nie jest zależne od architektury. Nie znam ludzi, którzy nawet próbowali. –