Windows GFlags设置是否捕获堆损坏(页堆除外)?

Windows GFlags设置是否捕获堆损坏(页堆除外)?,windows,visual-c++,windbg,heap-corruption,gflags,Windows,Visual C++,Windbg,Heap Corruption,Gflags,在一个生产站点上,我们的应用程序(*)反复崩溃,但不可复制。对崩溃转储的分析清楚地表明这是一个堆损坏:崩溃在不同的位置,但总是在kernel32内部发生访问冲突!HeapFree/ntdll!RtlpLowFragHeapFree。赢Dbg!analyze-v还报告堆损坏 到目前为止,我们尝试的是使用该选项运行应用程序。问题是页面堆的内存开销使得应用程序不再运行(达到32位进程的虚拟内存限制) 因此,我们不能使用页面堆。还有哪一个是有用的补充,以便我们 在腐败网站上崩溃 或者至少可以从崩溃转储

在一个生产站点上,我们的应用程序(*)反复崩溃,但不可复制。对崩溃转储的分析清楚地表明这是一个堆损坏:崩溃在不同的位置,但总是在
kernel32内部发生访问冲突!HeapFree
/
ntdll!RtlpLowFragHeapFree
。赢Dbg
!analyze-v
还报告堆损坏

到目前为止,我们尝试的是使用该选项运行应用程序。问题是页面堆的内存开销使得应用程序不再运行(达到32位进程的虚拟内存限制)

因此,我们不能使用页面堆。还有哪一个是有用的补充,以便我们

  • 在腐败网站上崩溃
  • 或者至少可以从崩溃转储中获得更多信息,当我们在
    HeapFree
    中崩溃时,最终会生成这些信息
我们目前正在试用以下标志:

希望下一次崩溃转储将包含更多错误信息

我考虑过这些旗帜,但暂时没有考虑:

  • 。。。当系统每次调用堆函数时都进行检查时,我预计会有相当大的开销
  • 。。。不确定这是否真的能给我买点什么
  • 。。。在这里,甚至连文档都警告说开销很高
我(还有)一个问题是,我不确定这些标志在内存损坏发生时有何帮助。当某些内容写入保护页时,页面堆显然会生成访问冲突,但是其他标志如何操作呢

我是否必须使用应用程序验证程序运行应用程序才能获得这些其他标志的帮助?或者,当检查代码检测到某些内容时,是否会引发异常

这些标志的哪种组合最有意义,以便应用程序在生产中仍能以正常的性能和内存消耗运行


(*):它是工业自动化中的32位Windows桌面应用程序。在本例中,在Win7 64位上运行(在许多其他站点上都可以)。

来自gflags GUI的“启用页面堆”可启用完整的页面堆验证,这可能会导致您描述的问题。gflags命令行为您提供了更多的控制,并允许您启用标准页堆验证,该验证使用的内存较少,但功能较弱。命令行还允许您使用/size、/dlls和/address选项混合使用标准和完整选项

以下是debugger.chm帮助文件中列出的选项:

*To enable and configure page heap verification:

    gflags /p /enable ImageFile  [ /full [/backwards] | /random Probability | /size SizeStart SizeEnd | /address AddressStart AddressEnd | /dlls DLL [DLL...] ]  [/debug ["DebuggerCommand"] | /kdebug] [/unaligned] [/notraces] [/fault Rate [TimeOut]] [/leaks] [/protect] [/no_sync] [/no_lock_checks]*
  • 控制所有这些检查的最简单方法是使用ApplicationVerifier。 你有一个完美的用户界面,你可以玩所有的旗帜
  • 无堆检查是一个很好的标志,没有太多开销。因此,如果一个堆块被严重修改,并且该块被释放,则可以中断调试器。如果损坏发生在块的分配和释放附近,这可能会有所帮助
  • AFAIK“Heap parameter chechking”只是一个轻量级的“调用时堆验证”。我在这方面从来没有成功过
  • 堆尾检查和标记非常简单和快速。有时对我有用
  • 您知道,您也可以使用gflags在每个应用程序的基础上控制这一点

    gflags.exe/i Testapp.exe e0

    但是:找到此类问题的最佳方法是完全使用调试CRT。。。如果可能的话。所以,如果有机会在生产环境中使用您的调试版本,请这样做。
    在调试CRT中,您可以再次使用和设置许多标志……

    实际上,我相信
    页面堆
    选项将是您的最佳选择。如果您还没有这样做,您可以尝试制定流程。希望这能给您足够的内存来实际使用该标志。