Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows C++/msvc6应用程序因堆损坏而崩溃,有任何提示吗?_Windows_Visual C++_Crash_Windbg_Heap Corruption - Fatal编程技术网

Windows C++/msvc6应用程序因堆损坏而崩溃,有任何提示吗?

Windows C++/msvc6应用程序因堆损坏而崩溃,有任何提示吗?,windows,visual-c++,crash,windbg,heap-corruption,Windows,Visual C++,Crash,Windbg,Heap Corruption,关于应用程序 它在Windows XP Professional SP2上运行 它是由微软Visual C++ 6用Service PACK 6构建的。李> 它是基于MFC的 它使用多个外部DLL(例如Xerces、ZLib或ACE) 它有很高的性能要求 它做了大量的网络和硬盘I/O,但它也是cpu密集型的 它有一个异常处理机制,当发生未处理的异常时,会生成一个小型转储 更新:这是一个高度多线程的应用程序,我们使用互斥来保护并发访问(当然,我们可能会在某些地方失败…) 关于坠机的事实 它只

关于应用程序

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

  • 它只发生在多处理器/多核机器上,并且工作负载很重
  • 它在运行数小时后随机发生(我们和我们的客户都没有发现模式)
  • 我们无法在我们的测试实验室复制崩溃。它只发生在一些生产系统上(但总是在多核机器上)
  • 它总是在同一点崩溃,尽管整个堆栈并不总是相同的。让我添加崩溃线程的堆栈(使用WinDbg获得,很抱歉我们没有符号)
异常代码:c0000005访问\u违规 地址:006a85b9 访问类型:写入 访问地址:2e020fff 故障地址:006a85b9 01:002a75b9 C:\MyDir\MyApplication.exe ChildEBP将参数重新寻址到Child 警告:堆栈展开信息不可用。下面的框架可能是错误的。 030af6c8 7c9206eb 77bfc3c9 01a80000 00224bc3 MyApplication+0x2a85b9 030af960 7c91e9c0 7c92901b 00000 AB4 00000000 ntdll!RTLALLOCATHEAP+0xeac(FPO:[非FPO]) 030af98c 7c9205c8 0000000 1 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:[非FPO]) 030afacc 77bfc2e3 0214e384 3087c8d8 02151030 0x4ba3ae96 030afb00 7c91e306 7c80bfc1 00000948 00000001 msvcrt!自由+0xc8(FPO:[非FPO]) 030afb20 0042965b 030afcc0 0214d780 02151218 ntdll!ZWreleaseMaphore+0xc(FPO:[3,0,0]) 030afb7c 7c9206eb 02e6c471 02ea0000 0000000 8 MyApplication+0x2965b 030afe60 7c9205c8 02151248 030aff38 7c920551 ntdll!RTLALLOCATHEAP+0xeac(FPO:[非FPO]) 030afe74 7c92056d 0210bfb8 02151250 02151250 ntdll!RtlpFreeToHeapLookaside+0x22(FPO:[2,0,4]) 030aff38 77bfc2de 01A80000000000 77bfc2e3 ntdll!RtlFreeHeap+0x647(FPO:[非FPO]) 7c92056d c5ffffff ce7c94be ff7c94be 00ffffff msvcrt!自由+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 90909090908B55FF8B MyApplication+0xbfffff 7c920581 907c94be 909090908B55FF8B 08458bec xerces_c_2_7 7c920585 9090908B55FF8B 08458bec 04408b66 0x907c94be 7c920589 8b55ff8b 08458bec 04408b66 0004c25d 0x909090 7c92058d 08458bec 04408b66 0004c25d 90909090 0x8b55ff8b
  • 地址MyApplication+0x2a85b9对应于调用std::list的erase()
到目前为止我所尝试的

  • 查看与崩溃结束点相关的所有代码
  • 尝试在我们的测试实验室启用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),但它大大降低了应用程序的速度
无法应用的可能解决方案(我知道)

  • “将应用程序迁移到较新的编译器”:我们正在进行这项工作,但目前还不是解决方案
  • “启用页面堆(正常或完全)”:我们无法在生产机器上启用页面堆,因为这会严重影响性能

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

您可以尝试通过对调试堆检查例程的调用来增加代码的难度,以查看是否可以找到更靠近源的损坏(您正在使用调试CRT跟踪此问题,对吗?):


使用windows调试工具中的应用程序验证程序。有时它会有帮助

尝试设置VS以下载OS调试符号,并确保应用程序中的“忽略帧指针”处于禁用状态。也许堆栈跟踪将提供信息

高度多线程

很久以前,我发现WinXP中每个进程的线程数是有限制的。我的测试片段只能创建少量线程。该问题由线程池解决

编辑:

就我而言,只要检查一下“应用程序”就足够了 Exception code: c0000005 ACCESS_VIOLATION Address : 006a85b9 Access Type : write Access Address : 2e020fff Fault address: 006a85b9 01:002a75b9 C:\MyDir\MyApplication.exe ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. 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: [Non-Fpo]) 7c920575 ff7c94be 00ffffff 12000000 907c94be 0xc5ffffff 7c920579 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+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 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()
unsigned __stdcall ThreadProc(LPVOID)
{
  _tprintf(_T("Thread started\n"));
  return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
  while (TRUE)
  {
    unsigned threadId = 0;
    _tprintf(_T("Start thread\n"));
    _beginthreadex( NULL, 0, &ThreadProc, NULL, 0, &threadId);
  }
  return 0;
}