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



Answers

Question

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?




Related