如何只在调试模式下激活ReportMemoryLeaksOnShutdown?

11

我需要激活ReportMemoryLeaksOnShutdown功能,以报告我的应用程序的内存泄漏情况,但仅在调试模式下(当Delphi IDE正在运行时)。我该怎么做?

3个回答

27

如果您指的是使用Debug构建配置(D2007+)编译时的“调试模式”,则已定义DEBUG符号,因此即使在运行时不在调试器中,也可以激活ReportMemoryLeaksOnShutdown:

{$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := True;
{$ENDIF}

如果你想只在调试器存在时运行,看一下RRUZ的答案


23

尝试使用 DebugHook 变量。

ReportMemoryLeaksOnShutdown:=DebugHook<>0;

2
可能还需要禁用与 DebugHook 相关的愚蠢警告,{$WARN SYMBOL_PLATFORM OFF} - jasonpenny
1
很愚蠢(对于我所拥有的Delphi版本),因为它们只能在Windows平台上运行,所以对我来说,这只是噪音。 - jasonpenny
1
我不认为警告是愚蠢的。我确实意识到Kylix没有得到后续支持,而Delphi.NET被Delphi Prism所取代。但是随着未来Delphi版本带来的东西(阅读路线图,在去年的DelphiLive演示和今年的一些活动中,其中一些有x64和/或Mac编译器预览),我认为这个警告可能会很烦人,但并不愚蠢。 - Jeroen Wiert Pluimers
@jason 好了,把警告关掉,别再抱怨了!仅仅因为你不需要它,并不意味着其他人也不需要。更重要的是,Emba的好心人给了你控制警告的权利。在我看来,做得很好。 - David Heffernan
1
项目选项是特定于项目的(因此名称)。虽然在IDE中仍有适用于每个项目的全局选项-它们只是不同的选项可用。尽管还有类似默认项目选项的东西。 - Uwe Raabe
显示剩余3条评论

4
我通常使用 IsDebuggerPresent API 函数,并在其周围加上 DEBUG 符号检查,以确保代码不会出现在发布版本中:
{$IFDEF DEBUG}   
  ReportMemoryLeaksOnShutDown := IsDebuggerPresent();
{$ENDIF}

如果您没有使用古老版本的Delphi并且在Windows 2000及更高版本上工作,则该函数应已在Windows单元中声明。


IsDebuggerPresent在Windows单元中未声明,因此: function IsDebuggerPresent: LongBool; stdcall; function IsDebuggerPresent; external kernel32 name 'IsDebuggerPresent'; - Reversed Engineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接