2012-01-09 5 views
102

Sto cercando di rilevare se un blocco di memoria non è stato liberato. Certo, il gestore mi dice che per finestra di dialogo o file di registro, ma cosa succede se mi piacerebbe memorizzare i risultati in un database? Per esempio vorrei avere in una tabella del database un nome di routine che hanno assegnato determinati blocchi.C'è un modo per dire a livello di programmazione se un particolare blocco di memoria non è stato liberato da FastMM?

Dopo aver letto una documentazione di FastMM, so che dalla versione 4.98 abbiamo la possibilità di essere notificati dal gestore in merito a allocazioni di memoria, liberazioni e riallocazioni man mano che si verificano. Ad esempio l'evento OnDebugFreeMemFinish ci sta passando un PFullDebugBlockHeader che contiene informazioni utili. C'è una cosa che manca PFullDebugBlockHeader - l'informazione se il blocco dato è stato liberato dall'applicazione.

A meno che OnDebugFreeMemFinish non venga chiamato solo per blocchi non liberati? Questo è ciò che non conosco e vorrei scoprire.

Il problema è che anche l'aggancio all'evento OnDebugFreeMemFinish non è stato possibile 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 la navigazione la fonte di FastMM ho visto che esiste una procedura:

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean); 

che potrebbe essere annullato, ma forse c'è un modo più semplice?

+0

Utilizzare il FastMM completo con le impostazioni appropriate e si riceverà un rapporto dettagliato di tutti i blocchi fuoriusciti all'arresto. Non è sufficiente per le tue esigenze? –

+0

No, come ho scritto: "La perdita è segnalata come previsto alla chiusura dell'applicazione" e questo non è ciò che voglio. Voglio registrarlo da solo. – Wodzu

+7

Ho sempre capito che FastMM può effettuare questo controllo solo come l'azione MOLTO ULTIMA che il programma dovrebbe eseguire, per definizione, così dal momento in cui FastMM rende il suo report completato il codice. Per ottenere una soluzione parziale puoi sempre dare un'occhiata alla loro fonte per vedere come viene contrassegnata la memoria allocata. –

risposta

1

Anche se esiste un gestore di questo tipo, sarebbe quasi inutile, poiché tutto, incluso DB, verrà interrotto nel momento in cui FastMM segnala perdite.

Quindi, suggerisco di attivare LogErrorsToFile insieme a FullDebugMode condizionali in FastMM4Options.inc. Questo ti darà un file di testo con perdite, che in seguito potrai analizzare e inserire in DB.

Problemi correlati