Saya mencoba mendeteksi jika sebuah blok memori tidak dibebaskan. Tentu saja, manajer memberitahu saya dengan kotak dialog atau file log, tetapi bagaimana jika saya ingin menyimpan hasil dalam database? Misalnya saya ingin memiliki dalam tabel database nama rutinitas yang dialokasikan blok tertentu.
Setelah membaca dokumentasi FastMM saya tahu bahwa sejak versi 4.98 kami memiliki kemungkinan untuk diberi tahu oleh manajer tentang alokasi memori, kebebasan dan realokasi saat terjadi. Misalnya OnDebugFreeMemFinish
peristiwa yang lewat kepada kita PFullDebugBlockHeader
yang berisi informasi yang berguna. Ada satu hal yang PFullDebugBlockHeader
hilang - informasi jika blok yang diberikan dibebaskan oleh aplikasi.
Kecuali OnDebugFreeMemFinish
dipanggil hanya untuk blok yang tidak dibebaskan? Ini yang tidak saya ketahui dan ingin saya ketahui.
Masalahnya adalah bahwa bahkan mengikuti OnDebugFreeMemFinish
acara saya tidak dapat mengetahui apakah blok itu dibebaskan atau tidak.
Berikut ini contohnya:
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.
Apa yang saya lewatkan adalah panggilan baliknya seperti:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Setelah menjelajahi sumber FastMM saya melihat ada prosedur:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
mana yang bisa dikesampingkan, tapi mungkin ada cara yang lebih mudah?
OnDebugFreeMemFinish
dipanggil berarti blok tersebut telah dibebaskan. Tidak adaOnMemoryLeak
acara. Tidak akan pernah ada acara seperti itu. Apa yang dilakukan FastMM adalah, saat dimatikan, menentukan bahwa setiap blok yang belum dibebaskan pasti bocor. Itu tidak dapat mendeteksi kebocoran lebih awal dari itu.AppendEventLog
tetapi Anda harus memodifikasi sumber FastMM yang saya curigai.Jawaban:
Bahkan jika penangan seperti itu ada, itu akan hampir tidak berguna, karena semuanya, termasuk DB akan dimatikan pada saat FastMM melaporkan kebocoran.
Jadi, saya sarankan Anda untuk menghidupkan
LogErrorsToFile
bersama denganFullDebugMode
persyaratan dalamFastMM4Options.inc
. Ini akan memberi Anda file teks dengan kebocoran, yang nantinya dapat Anda parsing dan dimasukkan ke dalam DB.sumber