Bir bellek bloğunun serbest bırakılıp bırakılmadığını tespit etmeye çalışıyorum. Tabii ki, yönetici bunu iletişim kutusu veya günlük dosyasıyla söylüyor, ancak sonuçları bir veritabanında saklamak istersem ne olur? Örneğin, bir veritabanı tablosunda, verilen blokları tahsis eden rutin isimleri olmasını istiyorum.
FastMM'nin bir belgesini okuduktan sonra, 4.98 sürümünden bu yana, bellek ayırmaları, serbest bırakmalar ve yeniden tahsisatlar hakkında yönetici tarafından bilgilendirilme olanağına sahip olduğumuzu biliyorum. Örneğin OnDebugFreeMemFinish
olay bize PFullDebugBlockHeader
yararlı bilgiler içeren bir geçiyor . PFullDebugBlockHeader
Eksik olan bir şey var - verilen blok uygulama tarafından serbest bırakılmışsa bilgi.
Sürece OnDebugFreeMemFinish
sadece serbest bloklar için denir? Bu bilmediğim ve öğrenmek istediğim şey.
Sorun şu ki, OnDebugFreeMemFinish
olaya takılırken bile bloğun serbest bırakılıp bırakılmadığını bulamadım.
İşte bir örnek:
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.
Eksik olduğum şey şöyle bir geri arama:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
FastMM kaynağına göz attıktan sonra bir prosedür olduğunu gördüm:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
hangisi geçersiz kılınabilir, ama belki daha kolay bir yolu vardır?
OnDebugFreeMemFinish
çağrılırsa bu, bloğun serbest bırakıldığı anlamına gelir. OnMemoryLeak
Olay yok . Asla böyle bir olay olamaz. FastMM'nin yaptığı, kapatma sırasında, serbest bırakılmamış blokların sızıntı olması gerektiğini belirlemektir. Bundan daha erken bir sızıntı tespit edemez.
AppendEventLog
ancak şüphelendiğim FastMM kaynağını değiştirmeniz gerekecek.