gpt4 book ai didi

windows - C++/msvc6 应用程序由于堆损坏而崩溃,有什么提示吗?

转载 作者:可可西里 更新时间:2023-11-01 13:25:51 26 4
gpt4 key购买 nike

关于申请

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

坠机事实

  • 它只发生在多处理器/多核机器和繁重的工作负载下。
  • 它在运行几个小时后随机发生(我们和我们的客户都还没有找到模式)。
  • 我们无法在我们的测试实验室重现崩溃。它只发生在一些生产系统上(但总是在多核机器上)
  • 它总是在同一点崩溃,尽管完整的堆栈并不总是相同的。让我添加崩溃线程的堆栈(使用 WinDbg 获得,抱歉我们没有符号)
Exception code: c0000005 ACCESS_VIOLATIONAddress        : 006a85b9Access Type    : writeAccess Address : 2e020fffFault address:  006a85b9 01:002a75b9 C:\MyDir\MyApplication.exeChildEBP RetAddr  Args to ChildWARNING: Stack unwind information not available. Following frames may be wrong.030af6c8 7c9206eb 77bfc3c9 01a80000 00224bc3 MyApplication+0x2a85b9030af960 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 0x4ba3ae96030afb00 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+0x2965b030afe60 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: [Non-Fpo])7c920575 ff7c94be 00ffffff 12000000 907c94be 0xc5ffffff7c920579 00ffffff 12000000 907c94be 90909090 0xff7c94be*** WARNING: Unable to verify checksum for xerces-c_2_7.dll*** ERROR: Symbol file could not be found.  Defaulted to export symbols for xerces-c_2_7.dll - 7c92057d 12000000 907c94be 90909090 8b55ff8b MyApplication+0xbfffff7c920581 907c94be 90909090 8b55ff8b 08458bec xerces_c_2_77c920585 90909090 8b55ff8b 08458bec 04408b66 0x907c94be7c920589 8b55ff8b 08458bec 04408b66 0004c25d 0x909090907c92058d 08458bec 04408b66 0004c25d 90909090 0x8b55ff8b
  • 地址 MyApplication+0x2a85b9 对应于对 std::list 的 erase() 的调用。

到目前为止我尝试了什么

  • 审查与崩溃结束发生点相关的所有代码。
  • 尝试在我们的测试实验室中启用页面堆,但目前尚未发现任何有用的信息。
  • 我们用 std::list 替换了一个 C 数组,然后它在代码的其他部分崩溃了(虽然它是相关代码,但它不在旧列表所在的代码中)。巧合的是,现在它在另一个删除中崩溃了,尽管这次是 std::multiset。让我复制转储中包含的堆栈:
ntdll.dll!_RtlpCoalesceFreeBlocks@16()  + 0x124e bytes  ntdll.dll!_RtlFreeHeap@12()  + 0x91f bytes  msvcrt.dll!_free()  + 0xc3 bytes    MyApplication.exe!006a4fda()[Frames below may be incorrect and/or missing, no symbols loaded for MyApplication.exe] MyApplication.exe!0069f305()ntdll.dll!_NtFreeVirtualMemory@16()  + 0xc bytes    ntdll.dll!_RtlpSecMemFreeVirtualMemory@16()  + 0x1b bytes   ntdll.dll!_ZwWaitForSingleObject@12()  + 0xc bytes  ntdll.dll!_RtlpFreeToHeapLookaside@8()  + 0x26 bytes    ntdll.dll!_RtlFreeHeap@12()  + 0x114 bytes  msvcrt.dll!_free()  + 0xc3 bytes    c5ffffff()  
  • (12-Apr-2010) 我尝试启用无堆检查(使用 gflags),但它会大大降低应用程序的速度...

可能的解决方案(据我所知)但无法应用

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

我想这就是我现在所记得的,如果我忘记了什么,我会尽快添加。如果您能给我一些提示或提出一些可能的解决方案,请毫不犹豫地回答!

最佳答案

您可以尝试通过调用调试堆检查例程来添加您的代码,以查看是否可以找到更接近源的损坏(您正在使用调试 CRT 来追踪这个问题,对吧?):

关于windows - C++/msvc6 应用程序由于堆损坏而崩溃,有什么提示吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com