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 OnDebugFreeMemFinish
evento está passando para nós um PFullDebugBlockHeader
que contém informações úteis. Há uma coisa que PFullDebugBlockHeader
está faltando - a informação se o bloco fornecido foi liberado pelo aplicativo.
A menos que OnDebugFreeMemFinish
seja chamado apenas para blocos não liberados? Isso eu não sei e gostaria de saber.
O problema é que, mesmo ao OnDebugFreeMemFinish
me 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?
fonte
OnDebugFreeMemFinish
for chamado, significa que o bloco foi liberado. Não háOnMemoryLeak
evento. 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.AppendEventLog
mas você precisará modificar a fonte FastMM que eu suspeito.Respostas:
Mesmo se tal manipulador existir, ele seria quase inútil, pois tudo, incluindo o banco de dados, seria encerrado no momento em que o FastMM relatasse os vazamentos.
Portanto, sugiro que você ative
LogErrorsToFile
junto com asFullDebugMode
condicionais emFastMM4Options.inc
. Isso lhe dará um arquivo de texto com vazamentos, que mais tarde você pode analisar e colocar no banco de dados.fonte