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]*
在调试CRT中,您可以再次使用和设置许多标志……实际上,我相信
页面堆
选项将是您的最佳选择。如果您还没有这样做,您可以尝试制定流程。希望这能给您足够的内存来实际使用该标志。