如何在 FastMM 中隐藏预期的内存泄漏?
How to hide expected memory leaks in FastMM?
我有以下显示问题的示例应用程序:
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
---------------------------
当我删除 "bad" 内存泄漏时,一切正常,没有显示任何报告。但是一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。
最初我在寻找这些 Indy 内存泄漏时发现了这一点,发现它们已注册但仍被报告为真正的内存泄漏。
当我使用内置 ReportMemoryLeaksOnShutdown := True
时,它只报告 TInterfacedObject
的泄漏。
那么在完全调试模式下使用 FastMM 时,有没有办法过滤掉已注册的内存泄漏?
要明确这一点:这是 FastMM zip 附带的 BorlndMM.dll,它声明这是开箱即用的替代品,它使用 FastMM4 并加载 FastMM_FullDebugMode.dll.因此,所有对内存管理器的调用都由 FastMM4 处理。但不知何故,它似乎忽略了过滤掉已注册的泄漏(在替换 BorlndMM.dll 中使用 FastMM 注册 - 在调试该 DLL 时可以看到)。是的,使用 FastMM4.pas 时不会报告已注册的泄漏,但改变它是没有争议的。
在FastMM4Options.inc中有以下内容:
{$ifdef borlndmmdll}
....
{$undef HideExpectedLeaksRegisteredByPointer}
....
HideExpectedLeaksRegisteredByPointer
的未定义是导致您观察到的行为的原因。重新编译已定义 HideExpectedLeaksRegisteredByPointer
的替换 borlandmm.dll,您预期的泄漏将从泄漏报告中消失。
但是,大概 HideExpectedLeaksRegisteredByPointer
是未定义的。至于为什么会这样,我不确定,但我无法想象 Pierre 会无意中取消定义它。不管怎样,定义HideExpectedLeaksRegisteredByPointer
或许是合理的。您可能愿意尝试一下。
我有以下显示问题的示例应用程序:
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
---------------------------
当我删除 "bad" 内存泄漏时,一切正常,没有显示任何报告。但是一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。
最初我在寻找这些 Indy 内存泄漏时发现了这一点,发现它们已注册但仍被报告为真正的内存泄漏。
当我使用内置 ReportMemoryLeaksOnShutdown := True
时,它只报告 TInterfacedObject
的泄漏。
那么在完全调试模式下使用 FastMM 时,有没有办法过滤掉已注册的内存泄漏?
要明确这一点:这是 FastMM zip 附带的 BorlndMM.dll,它声明这是开箱即用的替代品,它使用 FastMM4 并加载 FastMM_FullDebugMode.dll.因此,所有对内存管理器的调用都由 FastMM4 处理。但不知何故,它似乎忽略了过滤掉已注册的泄漏(在替换 BorlndMM.dll 中使用 FastMM 注册 - 在调试该 DLL 时可以看到)。是的,使用 FastMM4.pas 时不会报告已注册的泄漏,但改变它是没有争议的。
在FastMM4Options.inc中有以下内容:
{$ifdef borlndmmdll}
....
{$undef HideExpectedLeaksRegisteredByPointer}
....
HideExpectedLeaksRegisteredByPointer
的未定义是导致您观察到的行为的原因。重新编译已定义 HideExpectedLeaksRegisteredByPointer
的替换 borlandmm.dll,您预期的泄漏将从泄漏报告中消失。
但是,大概 HideExpectedLeaksRegisteredByPointer
是未定义的。至于为什么会这样,我不确定,但我无法想象 Pierre 会无意中取消定义它。不管怎样,定义HideExpectedLeaksRegisteredByPointer
或许是合理的。您可能愿意尝试一下。