GFlags设置捕捉堆损坏(页面堆除外)?

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

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

所以,我们不能使用Page Heap。 还有哪些其他标志可以用来添加,这样我们也可以

  • 在腐败网站发生崩溃
  • 或者至少可以从崩溃转储中获取更多信息,这些崩溃转储最终将在我们在HeapFree崩溃时生成?
  • 我们目前正在尝试标志:

  • 启用堆标记
  • 启用堆尾检查
  • 希望下一次故障转储会包含更多关于出错的信息。

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

  • 启用堆参数检查...当系统每次调用堆函数时都会检查一些开销
  • 启用无堆检查...不确定这是否真的会给我买东西
  • 在通话中启用堆验证...即使文档警告高昂的开销
  • 我(也)遇到的一个问题是,我不确定这些标记在发生内存损坏时如何提供帮助。 页面堆显然会在写入防护页时产生访问冲突,但其他标志如何操作?

    我是否必须使用Application Verifier运行应用程序才能获得这些其他标志? 或者当检查代码检测到什么时会引发异常?

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


    (*):这是工业自动化中的32位Windows桌面应用程序。 在这种情况下运行在Win7 64bit上(它在很多其他站点上运行得很好)。


  • 恕我直言,控制所有这些检查的最简单方法是使用ApplicationVerifier。 你有一个完美的用户界面,你可以玩所有的旗帜。
  • 无堆检查是一个很好的标志,没有太多的开销。 因此,如果堆块被严重修改并且该块被释放,那么您可以进入调试器。 如果腐败发生在分配和释放区块附近,这可能会有所帮助。
  • AFAIK“堆参数切削”只是一个轻量级的“堆上校验验证”。 我从来没有取得任何成功。
  • 堆尾检查和标记是简单而快速的。 有时为我工作。
  • 你知道你可以在每个应用程序基础上用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