我将现有的C ++应用程序从VS2008迁移到了由混合代码组成的VS2015。
在VS2008下,它可以同时编译为32位和64位的魅力。
现在已在VS2015下进行编译,但32位版本(虽然几乎每次都会重新编译)都可以工作,但是64位版本(Release build)随消息立即崩溃
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位版本正常运行。
答案 0 :(得分:0)
我进步很大。从这篇Mixed-mode C++/CLI crashing: heap corruption in atexit (static destructor registration)帖子中,我观察到确实该应用程序的入口点不是标准的,并且对其进行还原解决了崩溃问题。
现在仍然需要了解64位版本的速度。