【问题标题】:How to hide expected memory leaks in FastMM?如何在 FastMM 中隐藏预期的内存泄漏?
【发布时间】:2015-04-25 02:49:09
【问题描述】:

我有以下显示问题的示例应用程序:

program FalseMemLeak;

uses
  ShareMem;

var
  o: TObject;
begin
  o := TObject.Create; // "good" leak
  RegisterExpectedMemoryLeak(o);
  TInterfacedObject.Create; // bad leak
end.

我现在正在使用 BorlndMM.dll 替换和 FastMMFullDebug.dll,我得到以下报告:

---------------------------
FalseMemLeak.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are:

5 - 12 bytes: TObject x 1
13 - 20 bytes: TInterfacedObject x 1

---------------------------
OK   
---------------------------

当我删除“坏”内存泄漏时,一切都很好,并且没有显示任何报告。但是一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。

最初我在寻找这些 Indy 内存泄漏时发现了这一点,发现它们已注册但仍然报告在真正的内存泄漏中。

当我使用内置的ReportMemoryLeaksOnShutdown := True 时,它只报告TInterfacedObject 的泄漏。

那么在完全调试模式下使用 FastMM 时,有没有办法过滤掉注册的内存泄漏?


为了明确这一点:这是 FastMM zip 附带的 BorlndMM.dll,它声明这是开箱即用的替代品,它使用 FastMM4 并加载 FastMM_FullDebugMode.dll。因此,对内存管理器的所有调用都由 FastMM4 处理。但不知何故,它似​​乎忽略了过滤掉已注册的泄漏(在替换 BorlndMM.dll 中使用 FastMM 注册 - 在调试该 DLL 时可以看到)。是的,在使用 FastMM4.pas 时不会报告已记录的泄漏,但改变这一点没有争议。

【问题讨论】:

  • FastMM 不应该报告 已注册 泄漏。这就是注册它们的全部意义所在。所以其他事情正在发生。我怀疑ShareMemBorlndMM.dll 是罪魁祸首。这听起来像是您可能使用 FastMM 的一个副本在一个模块中分配内存,但使用 FastMM 的不同副本在另一个模块中注册内存,因此分配模块不知道注册模块的已注册泄漏列表。

标签: delphi memory-leaks fastmm


【解决方案1】:

在 FastMM4Options.inc 中有以下内容:

{$ifdef borlndmmdll}
  ....
  {$undef HideExpectedLeaksRegisteredByPointer}
....

HideExpectedLeaksRegisteredByPointer 的未定义是导致您观察到的行为的原因。重新编译替换 borlandmm.dll 并定义 HideExpectedLeaksRegisteredByPointer,泄漏报告将抑制您预期的泄漏。

不过,HideExpectedLeaksRegisteredByPointer 可能是未定义的。至于为什么会这样,我不确定,但我无法想象皮埃尔意外地未定义它。无论如何,定义HideExpectedLeaksRegisteredByPointer 或许是合理的。您可能愿意尝试一下。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2021-01-04
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多