2012-01-09 12 views
102

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?

+0

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? –

+0

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

+7

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. –

Respuesta

1

Incluso si existe ese controlador, sería casi inútil, ya que todo, incluida la base de datos, se cerraría en el momento en que FastMM informe de fugas.

Por lo tanto, sugiero que encienda LogErrorsToFile junto con FullDebugMode condicionales en FastMM4Options.inc. Esto le dará un archivo de texto con filtraciones, que luego puede analizar y poner en DB.

Cuestiones relacionadas