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 OnDebugFreeMemFinisholay bize PFullDebugBlockHeaderyararlı bilgiler içeren bir geçiyor . PFullDebugBlockHeaderEksik olan bir şey var - verilen blok uygulama tarafından serbest bırakılmışsa bilgi.
Sürece OnDebugFreeMemFinishsadece serbest bloklar için denir? Bu bilmediğim ve öğrenmek istediğim şey.
Sorun şu ki, OnDebugFreeMemFinisholaya 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. OnMemoryLeakOlay 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.
AppendEventLogancak şüphelendiğim FastMM kaynağını değiştirmeniz gerekecek.