Tôi đang cố gắng phát hiện xem một khối bộ nhớ chưa được giải phóng. Tất nhiên, người quản lý cho tôi biết điều đó bằng hộp thoại hoặc tệp nhật ký, nhưng nếu tôi muốn lưu trữ kết quả trong cơ sở dữ liệu thì sao? Ví dụ, tôi muốn có trong một bảng cơ sở dữ liệu tên của các quy trình đã phân bổ các khối đã cho.
Sau khi đọc tài liệu về FastMM, tôi biết rằng kể từ phiên bản 4.98, chúng tôi có khả năng được người quản lý thông báo về việc cấp phát bộ nhớ, giải phóng và phân bổ lại khi chúng xảy ra. Ví dụ OnDebugFreeMemFinish
sự kiện đang chuyển cho chúng tôi một sự PFullDebugBlockHeader
kiện chứa thông tin hữu ích. Có một thứ PFullDebugBlockHeader
còn thiếu - thông tin nếu khối đã cho đã được giải phóng bởi ứng dụng.
Trừ khi OnDebugFreeMemFinish
được gọi chỉ cho các khối không được giải phóng? Đây là điều mà tôi không biết và muốn tìm hiểu.
Vấn đề là ngay cả khi kết nối với OnDebugFreeMemFinish
sự kiện, tôi cũng không thể tìm hiểu xem liệu khối có được giải phóng hay không.
Đây là một ví dụ:
program MemLeakTest;
{$APPTYPE CONSOLE}
uses
FastMM4, ExceptionLog, SysUtils;
procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;
procedure Leak;
var
MyObject: TObject;
begin
MyObject := TObject.Create;
end;
begin
OnDebugFreeMemFinish := MemFreeEvent;
Leak;
end.
Những gì tôi đang thiếu là gọi lại như:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Sau khi duyệt qua nguồn của FastMM, tôi thấy rằng có một quy trình:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
có thể bị ghi đè, nhưng có thể có một cách dễ dàng hơn?
OnDebugFreeMemFinish
được gọi có nghĩa là khối đã được giải phóng. Không có OnMemoryLeak
sự kiện nào . Không bao giờ có thể có một sự kiện như vậy. Những gì FastMM làm là, khi tắt máy, xác định rằng bất kỳ khối nào chưa được giải phóng phải bị rò rỉ. Nó không thể phát hiện rò rỉ sớm hơn thế.
AppendEventLog
nhưng bạn sẽ cần sửa đổi nguồn FastMM mà tôi nghi ngờ.