Estoy tratando de detectar si no se liberó un bloque de memoria. Por supuesto, el administrador me lo dice mediante un cuadro de diálogo o un archivo de registro, pero ¿y si quisiera almacenar los resultados en una base de datos? Por ejemplo, me gustaría tener en una tabla de base de datos los nombres de las rutinas que asignaron bloques determinados.
Después de leer una documentación de FastMM, sé que desde la versión 4.98 tenemos la posibilidad de ser notificados por el administrador sobre las asignaciones de memoria, liberaciones y reasignaciones a medida que ocurren. Por ejemplo, un OnDebugFreeMemFinish
evento nos está pasando un PFullDebugBlockHeader
que contiene información útil. Hay una cosa que PFullDebugBlockHeader
falta: la información si el bloque dado fue liberado por la aplicación.
¿A menos que OnDebugFreeMemFinish
se llame solo para bloques no liberados? Esto es lo que no sé y me gustaría averiguar.
El problema es que incluso al conectarme al OnDebugFreeMemFinish
evento no pude averiguar si el bloque se liberó o no.
Aquí hay un ejemplo:
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.
Lo que me falta es la devolución de llamada como:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Después de navegar por la fuente de FastMM, vi que hay un procedimiento:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
que podría anularse, pero tal vez haya una manera más fácil.
OnDebugFreeMemFinish
se llama, significa que se liberó el bloque. No hayOnMemoryLeak
evento. Nunca podría haber tal evento. Lo que FastMM hace es, cuando se apaga, determinar que cualquier bloque que no se haya liberado debe ser una fuga. No puede detectar una fuga antes de eso.AppendEventLog
pero sospecho que necesitará modificar la fuente FastMM.Respuestas:
Incluso si existiera tal controlador, sería casi inútil, ya que todo, incluida la base de datos, se cerraría en el momento en que FastMM informa de las fugas.
Por lo tanto, le sugiero que active
LogErrorsToFile
junto con losFullDebugMode
condicionalesFastMM4Options.inc
. Esto le dará un archivo de texto con fugas, que luego puede analizar y poner en la base de datos.fuente