2012-10-14 46 views
12

Trong Delphi, tôi thường viết một bài kiểm tra rò rỉ đơn giản như thế này:Làm thế nào để phát hiện rò rỉ bộ nhớ trong Pascal/Lazarus miễn phí?

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. 

Làm thế nào để phát hiện rò rỉ bộ nhớ trong Free Pascal/Lazarus?

+0

Có một nỗ lực liên tục để chuyển FastMM4 vào FPC. Có lẽ bạn có thể là một phần. Sau đó, bạn có thể chạy mã của bạn chưa sửa đổi nếu FastMM4/FPC sẽ ổn định. http://lists.freepascal.org/lists/fpc-pascal/2005-December/009721.html http://lists.freepascal.org/lists/fpc-pascal/2009-June/021448.html –

Trả lời

16

Pascal miễn phí có tính năng tương tự. Vào cuối chương trình, hãy gọi DumpHeap hoặc bật tùy chọn heaptrc trong cài đặt dự án Lazarus. Tập tin đầu ra có thể được thiết lập với phương thức SetHeapTraceOutput. Cả hai phương thức đều nằm trong đơn vị heaptrc, đây phải là phương thức đầu tiên trong dự án (để nắm bắt phân bổ từ đầu).

Thông tin thêm:

rò rỉ hình dung: gói Lazarus "LeakView" trình bày các nội dung của một tập tin đầu ra đống dấu vết trong một hình cây . Nó được bao gồm trong cài đặt mặc định và có sẵn sau khi xây dựng lại IDE. (Chưa thử nghiệm của tôi)

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

Kết quả trông giống như:

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

(thử nghiệm với Free Pascal 2.6.0)

6

Trong khi mjn là hoàn toàn đúng, và những gì ông nói là giải pháp được ưu tiên, trên * nix người ta cũng có thể sử dụng đơn vị "cmem" (đơn vị đầu tiên trong chương trình chính) để chuyển trình quản lý bộ nhớ thành malloc của libc và sử dụng các công cụ gỡ lỗi khác.

Nếu các tùy chọn khác bị cạn kiệt, có thể đáng làm việc này và sử dụng valgrind. Lưu ý rằng để sử dụng valgrind bạn cần phải bật -gv.

+0

có thể chỉ một cài đặt FastMM4 vào FPC và sử dụng các cuộc gọi/vars mà anh ta đã quen với Delphi? –

+0

Không bao giờ thử. Tôi giả sử không phải không sửa đổi nặng (phân tích cú pháp thông tin gỡ lỗi cho backtraces thông tin tượng trưng có lẽ là hoàn toàn khác nhau), và chắc chắn nó không phải là phụ thuộc vào kiến ​​trúc. Tôi không biết những người thậm chí đã thử. –

Các vấn đề liên quan