Estou tentando detectar se um bloco de memória não foi liberado. Claro, o gerente me diz isso por caixa de diálogo ou arquivo de log, mas e se eu quiser armazenar os resultados em um banco de dados? Por exemplo, eu gostaria de ter em uma tabela de banco de dados os nomes das rotinas que alocaram determinados blocos.
Depois de ler a documentação do FastMM sei que desde a versão 4.98 temos a possibilidade de sermos notificados pelo gerente sobre as alocações, liberações e realocações de memória à medida que ocorrem. Por exemplo, o OnDebugFreeMemFinishevento está passando para nós um PFullDebugBlockHeaderque contém informações úteis. Há uma coisa que PFullDebugBlockHeaderestá faltando - a informação se o bloco fornecido foi liberado pelo aplicativo.
A menos que OnDebugFreeMemFinishseja chamado apenas para blocos não liberados? Isso eu não sei e gostaria de saber.
O problema é que, mesmo ao OnDebugFreeMemFinishme conectar ao evento, não consegui descobrir se o bloco foi liberado ou não.
Aqui está um exemplo:
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.
O que estou perdendo é o retorno de chamada como:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Depois de navegar na fonte do FastMM, vi que existe um procedimento:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
que poderia ser anulado, mas talvez haja uma maneira mais fácil?
OnDebugFreeMemFinishfor chamado, significa que o bloco foi liberado. Não há OnMemoryLeakevento. Nunca poderia haver tal evento. O que o FastMM faz é, ao desligar, determinar que todos os blocos que não foram liberados devem apresentar vazamentos. Ele não pode detectar um vazamento antes disso.
AppendEventLogmas você precisará modificar a fonte FastMM que eu suspeito.