GFlags设置捕捉堆损坏(页面堆除外)?
在一个生产站点,我们的应用程序(*)会重复崩溃,但不可重复。 分析崩溃转储清楚地表明这是一个堆损坏:崩溃位于不同位置,但始终访问kernel32!HeapFree
/ ntdll!RtlpLowFragHeapFree
。 Win Dbg !analyze -v
也报告堆损坏。
到目前为止,我们尝试过的是使用GFlags选项Page Heap来运行应用程序。 问题是,页堆的内存开销使应用程序不再运行(达到32位进程的虚拟内存限制)。
所以,我们不能使用Page Heap。 还有哪些其他标志可以用来添加,这样我们也可以
HeapFree
崩溃时生成? 我们目前正在尝试标志:
希望下一次故障转储会包含更多关于出错的信息。
我考虑过这些标志,但暂时将它们排除在外:
我(也)遇到的一个问题是,我不确定这些标记在发生内存损坏时如何提供帮助。 页面堆显然会在写入防护页时产生访问冲突,但其他标志如何操作?
我是否必须使用Application Verifier运行应用程序才能获得这些其他标志? 或者当检查代码检测到什么时会引发异常?
这些标志的哪个组合最有意义,这样应用程序仍然可以在生产中以OK性能和内存消耗运行?
(*):这是工业自动化中的32位Windows桌面应用程序。 在这种情况下运行在Win7 64bit上(它在很多其他站点上运行得很好)。
你知道你可以在每个应用程序基础上用gflags来控制它。
gflags.exe / i Testapp.exe e0
但是:找到这些问题的最好方法是完全使用Debug-CRT ......如果可能的话。 因此,如果有机会在生产环境中使用Debug-Version,请执行此操作。 在Debug-CRT里面你可以使用和设置很多标志....
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]*
链接地址: http://www.djcxy.com/p/82341.html
上一篇: GFlags setting to catch heap corruption (other than Page Heap)?
下一篇: CSocket:: Create throwing exception in my MFC application