关于应用程序

  • 它在Windows XP Professional SP2上运行。
  • 它是使用Microsoft Visual C++ 6.0 Service Pack 6构建的。
  • 这是基于MFC的。
  • 它使用多个外部dll(例如Xerces,ZLib或ACE)。
  • 它具有很高的性能要求。
  • 它执行大量的网络和硬盘I/O,但它也是CPU密集型的。
  • 它具有异常处理机制,当发生未处理的异常时会生成一个小型转储。
  • 更新:这是一个高度多线程的应用程序,我们使用互斥锁来保护并发访问(当然,我们可能会在某些地方失败...)

  • 关于崩溃的事实
  • 它仅在多处理器/多核计算机上并且在繁重的工作中发生。
  • 运行了几个小时后,它是随机发生的(我们和我们的客户都尚未找到模式)。
  • 我们无法在测试实验室中重现崩溃。它仅在某些生产系统(但始终在多核计算机上)中发生
  • 尽管整个堆栈并不总是相同的,但它总是总是在同一点崩溃。让我添加崩溃线程的堆栈(使用WinDbg获得,抱歉,我们没有符号)

  • 异常代码:c0000005 ACCESS_VIOLATION
    地址:006a85b9
    访问类型:写
    访问地址:2e020fff
    故障地址:006a85b9 01:002a75b9 C:\MyDir\MyApplication.exe

    ChildEBP RetAddr Args传递给子级
    警告:堆栈展开信息不可用。以下框架可能是错误的。
    030af6c8 7c9206eb 77bfc3c9 01a80000 00224bc3 MyApplication + 0x2a85b9
    030af960 7c91e9c0 7c92901b 00000ab4 00000000 ntdll!RtlAllocateHeap + 0xeac(FPO:[Non-Fpo])
    030af98c 7c9205c8 00000001 00000000 00000000 ntdll!ZwWaitForSingleObject + 0xc(FPO:[3,0,0])
    030af9c0 7c920551 01a80898 7c92056d 313adfb0 ntdll!RtlpFreeToHeapLookaside + 0x22(FPO:[2,0,4])
    030afa8c 4ba3ae96 000307da 00130005 00040012 ntdll!RtlFreeHeap + 0x1e9(FPO:[Non-Fpo])
    030afacc 77bfc2e3 0214e384 3087c8d8 02151030 0x4ba3ae96
    030afb00 7c91e306 7c80bfc1 00000948 00000001 msvcrt!free + 0xc8(FPO:[Non-Fpo])
    030afb20 0042965b 030afcc0 0214d780 02151218 ntdll!ZwReleaseSemaphore + 0xc(FPO:[3,0,0])
    030afb7c 7c9206eb 02e6c471 02ea0000 00000008 MyApplication + 0x2965b
    030afe60 7c9205c8 02151248 030aff38 7c920551 ntdll!RtlAllocateHeap + 0xeac(FPO:[Non-Fpo])
    030afe74 7c92056d 0210bfb8 02151250 02151250 ntdll!RtlpFreeToHeapLookaside + 0x22(FPO:[2,0,4])
    030aff38 77bfc2de 01a80000 00000000 77bfc2e3 ntdll!RtlFreeHeap + 0x647(FPO:[Non-Fpo])
    7c92056d c5ffffff ce7c94be ff7c94be 00ffffff msvcrt!free + 0xc3(FPO:[非Fpo])
    7c920575 ff7c94be 00ffffff 12000000 907c94be 0xc5ffffff
    7c920579 00ffffff 12000000 907c94be 90909090 0xff7c94be
    ***警告:无法验证xerces-c_2_7.dll的校验和
    ***错误:找不到符号文件。默认为xerces-c_2_7.dll导出符号-
    7c92057d 12000000 907c94be 90909090 8b55ff8b MyApplication + 0xbfffff
    7c920581 907c94be 90909090 8b55ff8b 08458bec xerces_c_2_7
    7c920585 90909090 8b55ff8b 08458bec 04408b66 0x907c94be
    7c920589 8b55ff8b 08458bec 04408b66 0004c25d 0x90909090
    7c92058d 08458bec 04408b66 0004c25d 90909090 0x8b55ff8b
  • 地址MyApplication + 0x2a85b9对应于对std::list的delete()的调用。

  • 我到目前为止已经尝试过的内容
  • 查看与崩溃结束点有关的所有代码。
  • 尝试在我们的测试实验室上启用pageheap,尽管到目前为止没有发现有用的东西。
  • 我们已将std::list替换为C数组,然后它在代码的其他部分崩溃(尽管它是相关代码,但不在旧列表所在的代码中)。巧合的是,尽管这次是std::multiset,但它现在又崩溃了。让我复制转储中包含的堆栈:

  • ntdll.dll!_RtlpCoalesceFreeBlocks@16()+ 0x124e字节
    ntdll.dll!_RtlFreeHeap@12()+ 0x91f字节
    msvcrt.dll!_free()+ 0xc3字节
    MyApplication.exe!006a4fda()
    [以下框架可能不正确和/或丢失,没有为MyApplication.exe加载任何符号]
    MyApplication.exe!0069f305()
    ntdll.dll!_NtFreeVirtualMemory@16()+ 0xc字节
    ntdll.dll!_RtlpSecMemFreeVirtualMemory@16()+ 0x1b字节
    ntdll.dll!_ZwWaitForSingleObject@12()+ 0xc字节
    ntdll.dll!_RtlpFreeToHeapLookaside@8()+ 0x26字节
    ntdll.dll!_RtlFreeHeap@12()+ 0x114字节
    msvcrt.dll!_free()+ 0xc3字节
    c5ffffff()
  • (2010年4月12日)我尝试启用无堆检查(使用gflags),但是它会使应用程序减慢很多速度...

  • 无法识别的可能解决方案(我知道)
  • “将应用程序迁移到较新的编译器”:我们正在努力解决此问题,但目前还不是解决方案。
  • “启用pageheap(正常或完整)”:我们无法在生产计算机上启用pageheap,因为这会严重影响性能。

  • 我想这就是我现在所记得的,如果我忘记了一些东西,我会尽快添加它。如果您可以给我一些提示或提出一些可能的解决方案,请随时回答!

    最佳答案

    您可以尝试使用对调试堆检查例程的调用来充实代码,以查看是否可以将损坏定位在更靠近源的位置(您正在使用调试CRT来跟踪此问题,对吗?):

  • http://msdn.microsoft.com/en-us/library/aa271695(VS.60).aspx
  • 09-26 11:07