delphi memory-leaks delphi-2009 fastmm

delphi - ¿Hay alguna manera de decir programáticamente si FastMM no liberó un bloque de memoria en particular?



memory-leaks delphi-2009 (1)

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.

Después de leer una documentación de FastMM, sé ​​que desde la versión 4.98 tenemos la posibilidad de recibir una notificación del administrador sobre las asignaciones de memoria, las liberaciones y las reasignaciones a medida que ocurren. Por ejemplo, el evento OnDebugFreeMemFinish nos pasa 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 OnDebugFreeMemFinish solo para bloques no liberados? Esto es lo que no sé y me gustaría saber.

El problema es que incluso al conectarme al evento OnDebugFreeMemFinish , no pude averiguar si el bloque se había liberado 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 explorar 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?


Incluso si ese controlador existiera, 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, le sugiero que active LogErrorsToFile junto con los condicionales FastMM4Options.inc en FastMM4Options.inc . Esto le dará un archivo de texto con filtraciones, que luego puede analizar y poner en DB.