Есть ли способ программно определить, был ли конкретный блок памяти не освобожден FastMM? - PullRequest
103 голосов
/ 09 января 2012

Я пытаюсь определить, не был ли освобожден блок памяти.Конечно, менеджер сообщает мне это по диалоговому окну или файлу журнала, но что, если я хотел бы сохранить результаты в базе данных?Например, я хотел бы иметь в таблице базы данных имена подпрограмм, которые распределяли данные блоки.

После прочтения документации 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);

, который можно переопределить, но, может быть, есть более простой способ?

1 Ответ

1 голос
/ 23 октября 2013

Даже если бы такой обработчик существовал, он был бы почти бесполезен, поскольку все, включая БД, было бы закрыто в тот момент, когда FastMM сообщает об утечках.

Итак, я предлагаю вам включить LogErrorsToFile вместе с FullDebugMode условиями в FastMM4Options.inc. Это даст вам текстовый файл с утечками, который позже вы сможете проанализировать и поместить в БД.

...