Estoy tratando de detectar si un bloque de memoria no fue liberado. Por supuesto, el gerente me lo dice por cuadro de diálogo o archivo de registro, pero ¿qué ocurre si me gustaría 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 asignan los bloques dados.¿Hay alguna forma de indicar mediante programación si un bloque de memoria en particular no fue liberado por FastMM?
Después de leer una documentación de FastMM, sé que desde la versión 4.98 tenemos la posibilidad de ser notificado por el administrador acerca de las asignaciones de memoria, liberaciones y reasignaciones a medida que ocurren. Por ejemplo, el evento OnDebugFreeMemFinish
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 se llame a OnDebugFreeMemFinish
solo para bloques no liberados? Esto es lo que no sé y me gustaría saber.
El problema es que incluso enganchándome en el evento OnDebugFreeMemFinish
no pude averiguar si el bloque se liberó o no.
Aquí se muestra 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 ser anulado, pero tal vez hay una manera más fácil?
Utilice FastMM completo con la configuración adecuada y recibirá un informe detallado de todos los bloques filtrados al apagar. ¿Esto no es suficiente para tus necesidades? –
No, como escribí: "La fuga se informa como se esperaba al cerrar la aplicación" y esto no es lo que quiero. Quiero iniciar sesión solo – Wodzu
Siempre he entendido que FastMM solo puede hacer esta comprobación como la ÚLTIMA acción que el programa debe realizar, por definición, de modo que cuando FastMM realiza su informe, su código ha finalizado. Para obtener una solución parcial, siempre puede echar un vistazo a su fuente para ver cómo se marca la memoria asignada. –