【发布时间】:2019-07-12 19:35:58
【问题描述】:
我将一个现有的 C++ 应用程序从 VS2008 迁移到 VS2015,它由混合代码组成。
在 VS2008 下编译为 32 位和 64 位都像一个魅力。
现在在 VS2015 下编译,32 位版本可以工作(尽管它几乎每次都重新编译)但是 64 位版本(发布版本)会立即崩溃并显示消息
Unhandled exception at 0x00007FFF52E3B049 (ntdll.dll) in mViz+.exe: 0xC0000374: A heap has been corrupted (parameters: 0x00007FFF52EA27F0)
和调用栈
ntdll.dll!RtlReportFatalFailure() Unknown
ntdll.dll!RtlReportCriticalFailure() Unknown
ntdll.dll!RtlpHeapHandleError() Unknown
ntdll.dll!RtlpHpHeapHandleError() Unknown
ntdll.dll!RtlpLogHeapFailure() Unknown
ntdll.dll!RtlSizeHeap() Unknown
ucrtbase.dll!_recalloc_base() Unknown
ucrtbase.dll!<lambda>(void)() Unknown
ucrtbase.dll!__crt_seh_guarded_call<int>::operator()<<lambda_638799b9deba96c50f710eeac98168cd>,<lambda>(void) & __ptr64,<lambda_a6f7d7db0129f75315ebf26d50c089f1> >() Unknown
ucrtbase.dll!_register_onexit_function() Unknown
> mViz+.exe!_onexit(int(*)() function) Line 268 C++
mViz+.exe!atexit(void(*)() function) Line 276 C++
mViz+.exe!__scrt_initialize_thread_safe_statics() Line 110 C++
[External Code]
mscoreei.dll!_CorExeMain() Unknown
mscoree.dll!_CorExeMain_Exported() Unknown
kernel32.dll!BaseThreadInitThunk() Unknown
ntdll.dll!RtlUserThreadStart() Unknown
这是在调试器控制下发生的。否则,应用程序将无法启动。
调试版本也有问题的行为。没有调试器,
并与:
Exception thrown at 0x00007FFF52DA70A0 (ntdll.dll) in mViz+.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
If there is a handler for this exception, the program may be safely continued.
这似乎是一个堆损坏问题,但我感觉崩溃发生在我的任何代码被调用之前。
我该如何调查?
更新:
在某些情况下,我会收到以下消息:
Unhandled Exception: System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at _initterm_e((fnptr)* pfbegin, (fnptr)* pfend) in f:\dd\vctools\crt\crtw32\msilcrt\puremsilcode.cpp:line 69
at <CrtImplementationDetails>.LanguageSupport.InitializeNative(LanguageSupport* ) in f:\dd\vctools\crt\crtw32\msilcrt\mstartup.cpp:line 355
at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* ) in f:\dd\vctools\crt\crtw32\msilcrt\mstartup.cpp:line 598
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* ) in f:\dd\vctools\crt\crtw32\msilcrt\mstartup.cpp:line 805
at .cctor() in f:\dd\vctools\crt\crtw32\msilcrt\mstartup.cpp:line 856
--- End of inner exception stack trace ---
更新 2:
我知道不看现象很难回答。但我不是在问原因,而是在问如何更深入地调查,因为调试器没有帮助。 (它告诉我的只是在启动时存在堆损坏。)
更新 3:
迁移到 VS2017 后,应用程序确实启动了,但 64 位版本非常慢。事实上,无法使用。其中一个线程显示了 100% 的负载。 32 位构建运行正常。
【问题讨论】:
-
哎呀,对不起 :) 无论如何,如果没有一些代码,就很难说什么,但如果你有的话,可能依赖于第三方库。
-
@MichaelChourdakis:调试版本显示相同的堆栈。
-
@MichaelChourdakis:所有代码都是在库中预编译的 C++ CLI 和本机 C++(我的代码)。多年来,一切都得到了验证。
-
@MichaelChourdakis:代码太大,无法显示。
标签: c++ visual-studio-2015 crash migration