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

102

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

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

который может быть переоценен, но, возможно, есть более простой способ?

  • 0
    Используйте полный FastMM с соответствующими настройками, и при завершении работы вы получите подробный отчет обо всех просочившихся блоках. Разве этого недостаточно для ваших нужд?
  • 0
    Нет, как я писал: «Утечка сообщается, как ожидается, при закрытии приложения», и это не я хочу. Я хочу записать это самостоятельно.
Показать ещё 9 комментариев
Теги:
memory-leaks
delphi-2009
fastmm

1 ответ

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню