在一个生产站点上,我们的应用程序(*)反复崩溃,但不可重现。分析崩溃转储清楚地表明这是一个堆损坏:崩溃位于不同的位置,但总是访问kernel32!HeapFree
/内部的违规行为ntdll!RtlpLowFragHeapFree
。Win Dbg!analyze -v
还报告堆损坏。
到目前为止,我们尝试的是使用GFlags选项Page Heap运行应用程序。问题是页面堆的内存开销使得应用程序不再运行(达到 32 位进程的虚拟内存限制)。
所以,我们不能使用 Page Heap。添加哪些其他标志会很有用,这样我们要么
- 在腐败现场崩溃
- 或者至少可以从崩溃转储中获取更多信息,这些信息最终会在我们崩溃时生成
HeapFree
?
我们目前正在尝试这些标志:
希望下一个故障转储将包含更多有关问题所在的信息。
我考虑了这些标志,但现在将它们排除在外:
我(也)遇到的一个问题是我不确定这些标志在发生内存损坏时如何提供帮助。当有东西写入保护页时,Page Heap 显然会产生访问冲突,但是其他标志如何操作?
我是否必须使用 Application Verifier 运行应用程序才能获得这些其他标志的帮助?或者当检查代码检测到某些东西时会引发异常?
这些标志的哪个组合最有意义,以便应用程序仍然可以在生产中以正常的性能和内存消耗运行?
(*) : 它是工业自动化领域的 32 位 Windows 桌面应用程序。在这种情况下在 Win7 64 位上运行(它在很多其他站点上都很好)。