windows - GFlags 设置以捕获堆损坏(Page Heap 除外)?

标签 windows visual-c++ windbg heap-corruption gflags

在一个生产站点上,我们的应用程序(*) 反复崩溃,但无法重现。分析崩溃转储清楚地表明它是堆损坏:崩溃发生在不同的位置,但始终在 kernel32!HeapFree/ntdll!RtlpLowFragHeapFree 内访问冲突。 Win Dbg !analyze -v 也报告堆损坏。

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

所以,我们不能使用页面堆。还有哪个flags添加将很有用,这样我们要么

  • 在腐败现场撞车
  • 或者至少可以从我们在 HeapFree 中崩溃时最终生成的故障转储中获取更多信息?

我们目前正在尝试这些标志:

希望下一个故障转储将包含更多有关错误原因的信息。

我考虑过这些标志,但暂时将它们排除在外:

我(也)遇到的一个问题是,我不确定这些标志在发生内存损坏时如何提供帮助。 Page Heap 显然会在保护页写入内容时产生访问冲突,但其他标志如何操作?

我是否必须使用 Application Verifier 运行应用程序才能获得这些其他标志的帮助?还是检查代码检测到异常时会抛出异常?

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


<子> (*) : 它是工业自动化中的 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]*

关于windows - GFlags 设置以捕获堆损坏(Page Heap 除外)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19023230/

相关文章:

c++ - 如何枚举进程中所有命名管道的名称?

c# - C#写的函数可以用C语言调用吗?

c++ - 数组迭代器不可取消引用错误

debugging - 页堆没有记录有用的堆栈信息?

.net - WPF中的win32窗口

outlook - 分析 Outlook HANG 转储(安装了 GoogleCalendarSync 插件)

C Hello world : Code Blocks IDE, Windows 上的 MinGW C 编译器

string - Windows批处理文件-在文件中查找字符串并将其追加

c++ - 最新的 OpenGL 应用程序是否必须使用 GLEW?

c++ - 如何编写编译器可以优化到 SIMD 比较的代码?