有没有办法以编程方式判断 FastMM 是不是没有释放特定的内存块?

Posted

技术标签:

【中文标题】有没有办法以编程方式判断 FastMM 是不是没有释放特定的内存块?【英文标题】:Is there a way to programmatically tell if particular block of memory was not freed by FastMM?有没有办法以编程方式判断 FastMM 是否没有释放特定的内存块? 【发布时间】:2012-02-05 19:01:04 【问题描述】:

我正在尝试检测是否有一块内存没有被释放。当然,经理通过对话框或日志文件告诉我,但如果我想将结果存储在数据库中怎么办?例如,我想在数据库表中有一个分配给定块的例程名称。

在阅读了 FastMM 的文档后,我知道从 4.98 版开始,我们可能会在发生内存分配、释放和重新分配时收到管理器的通知。例如OnDebugFreeMemFinish 事件向我们传递了一个包含有用信息的PFullDebugBlockHeaderPFullDebugBlockHeader 缺少一件事 - 如果给定块已被应用程序释放的信息。

除非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);

这可以被覆盖,但也许有更简单的方法?

【问题讨论】:

我一直明白 FastMM 只能将此检查作为程序应该执行的最后一个操作 - 根据定义 - 所以当 FastMM 报告您的代码时,您的代码已经完成。要获得部分解决方案,您可以随时查看他们的源代码,了解分配的内存是如何标记的。 按预期泄漏?您是否按预期注册了它。此外,除非您提供理解预期寿命的复杂逻辑,否则您无法确定内存是否泄漏,直到关闭。 如果OnDebugFreeMemFinish 被调用,这意味着块被释放。没有OnMemoryLeak 事件。永远不可能有这样的事件。 FastMM 所做的是,在关闭时,确定任何尚未释放的块都必须是泄漏的。它无法在此之前检测到泄漏。 每当 FastMM 告诉我存在内存泄漏时,我都会关闭工具并立即修复它。如果你不这样做,那么你会发现很难重现泄漏。如果您真的希望登录到数据库,那么您需要查看 CheckBlocksOnShutdown 函数。另一个潜在的扩展点是AppendEventLog,但你需要修改我怀疑的 FastMM 源。 Erm 只是拿起文件,解析它并把它放在数据库中? 【参考方案1】:

即使存在这样的处理程序,它也几乎没有用,因为在 FastMM 报告泄漏时,包括 DB 在内的所有内容都将被关闭。

所以,我建议你在FastMM4Options.inc 中打开LogErrorsToFileFullDebugMode 条件。这将为您提供一个带有泄漏的文本文件,稍后您可以对其进行解析并放入 DB。

【讨论】:

以上是关于有没有办法以编程方式判断 FastMM 是不是没有释放特定的内存块?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以编程方式确定字体文件是不是具有特定的 Unicode 字形?

如何(以编程方式)判断是不是有/没有任何支持打开特定文档类型的注册应用程序?

有没有办法以编程方式列出所有 gradle 依赖项?

有没有办法以编程方式获取 iOS 中音频单元的所有参数?

有没有办法以编程方式列出所有gradle依赖项?

有没有办法以编程方式为 iOS 上的 3rd 方应用程序获取 UI 层次结构?