Sto cercando di rilevare se un blocco di memoria non è stato liberato. Ovviamente, il manager me lo dice tramite la finestra di dialogo o il file di registro, ma cosa succede se volessi memorizzare i risultati in un database? Ad esempio, vorrei avere in una tabella di database i nomi delle routine che allocano determinati blocchi.
Dopo aver letto una documentazione di FastMM, so che dalla versione 4.98 abbiamo la possibilità di essere avvisati dal manager sulle allocazioni di memoria, sui liberi e sulle riallocazioni quando si verificano. Ad esempio ci OnDebugFreeMemFinish
sta passando un evento PFullDebugBlockHeader
che contiene informazioni utili. C'è una cosa che PFullDebugBlockHeader
manca: le informazioni se il blocco specificato è stato liberato dall'applicazione.
A meno che non OnDebugFreeMemFinish
venga chiamato solo per blocchi non liberati? Questo è quello che non so e vorrei scoprire.
Il problema è che anche agganciando OnDebugFreeMemFinish
all'evento non sono riuscito a scoprire se il blocco è stato liberato o meno.
Ecco un esempio:
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.
Quello che mi manca è il callback come:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Dopo aver sfogliato i sorgenti di FastMM ho visto che esiste una procedura:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
quale potrebbe essere sovrascritto, ma forse c'è un modo più semplice?
OnDebugFreeMemFinish
viene chiamato significa che il blocco è stato liberato. Non ci sono OnMemoryLeak
eventi. Non potrebbe mai esserci un simile evento. Quello che fa FastMM è, all'arresto, determinare che tutti i blocchi che non sono stati liberati devono essere perdite. Non è in grado di rilevare una perdita prima di allora.
AppendEventLog
ma è necessario modificare la fonte FastMM che sospetto.