Я пытаюсь определить, не был ли освобожден блок памяти. Конечно, менеджер сообщает мне это с помощью диалогового окна или файла журнала, но что, если я хочу сохранить результаты в базе данных? Например, я хотел бы иметь в таблице базы данных имена подпрограмм, которые выделяли данные блоки.
После прочтения документации FastMM я знаю, что с версии 4.98 у нас есть возможность получать уведомления от менеджера о выделении, освобождении и перераспределении памяти по мере их возникновения. Например, OnDebugFreeMemFinish
нам передается событие, PFullDebugBlockHeader
которое содержит полезную информацию. Не PFullDebugBlockHeader
хватает одного - информации о том, был ли данный блок освобожден приложением.
Разве OnDebugFreeMemFinish
вызывается только для не освобожденных блоков? Этого я не знаю и хотел бы узнать.
Проблема в том, что даже подключившись к OnDebugFreeMemFinish
событию, я не смог узнать, освобожден блок или нет.
Вот пример:
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.
Мне не хватает обратного вызова, например:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
После просмотра исходного кода FastMM я увидел, что есть процедура:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
что можно было бы переопределить, но, может быть, есть более простой способ?
OnDebugFreeMemFinish
вызывается, это означает, что блок освобожден. НетOnMemoryLeak
события. Такого события не могло быть никогда. FastMM при завершении работы определяет, что все блоки, которые не были освобождены, должны быть утечками. Он не может обнаружить утечку раньше этого.AppendEventLog
я подозреваю, что вам нужно изменить источник FastMM.Ответы:
Даже если такой обработчик существует, он был бы почти бесполезен, так как все, включая БД, было бы отключено в то время, когда FastMM сообщает об утечках.
Итак, я предлагаю вам включить
LogErrorsToFile
вместе сFullDebugMode
условными операторами вFastMM4Options.inc
. Это даст вам текстовый файл с утечками, который позже вы сможете проанализировать и поместить в БД.источник