Ich versuche festzustellen, ob ein Speicherblock nicht freigegeben wurde. Natürlich sagt mir der Manager das per Dialogfeld oder Protokolldatei, aber was ist, wenn ich Ergebnisse in einer Datenbank speichern möchte? Zum Beispiel möchte ich in einer Datenbanktabelle Namen von Routinen haben, die bestimmte Blöcke zugewiesen haben.
Nachdem ich eine Dokumentation von FastMM gelesen habe, weiß ich, dass wir seit Version 4.98 die Möglichkeit haben, vom Manager über Speicherzuweisungen, Freigaben und Neuzuweisungen benachrichtigt zu werden, sobald diese auftreten. Zum Beispiel geht ein OnDebugFreeMemFinish
Ereignis an uns über, PFullDebugBlockHeader
das nützliche Informationen enthält. Es PFullDebugBlockHeader
fehlt eine Sache - die Information, ob der angegebene Block von der Anwendung freigegeben wurde.
Es OnDebugFreeMemFinish
sei denn, wird nur für nicht freigegebene Blöcke aufgerufen? Das weiß ich nicht und möchte es herausfinden.
Das Problem ist, dass OnDebugFreeMemFinish
ich selbst bei einem Ereignis nicht herausfinden konnte, ob der Block freigegeben wurde oder nicht.
Hier ist ein Beispiel:
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.
Was mir fehlt, ist der Rückruf wie:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Nachdem ich die Quelle von FastMM durchsucht hatte, sah ich, dass es eine Prozedur gibt:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
was könnte überschrieben werden, aber vielleicht gibt es einen einfacheren Weg?
OnDebugFreeMemFinish
aufgerufen wird, bedeutet dies, dass der Block freigegeben wurde. Es gibt keineOnMemoryLeak
Veranstaltung. Es könnte niemals ein solches Ereignis geben. FastMM stellt beim Herunterfahren fest, dass alle nicht freigegebenen Blöcke undicht sein müssen. Es kann kein Leck früher erkennen.AppendEventLog
, dass Sie die von mir vermutete FastMM-Quelle ändern müssen.Antworten:
Selbst wenn ein solcher Handler vorhanden wäre, wäre er nahezu nutzlos, da alles, einschließlich der Datenbank, zu dem Zeitpunkt heruntergefahren würde, an dem FastMM Lecks meldet.
Also, ich schlage vor, dass Sie sich
LogErrorsToFile
zusammen mit denFullDebugMode
Bedingungen einschaltenFastMM4Options.inc
. Dadurch erhalten Sie eine Textdatei mit Lecks, die Sie später analysieren und in die Datenbank einfügen können.quelle