在VS2015下无法下放64位应用程序

时间:2019-07-12 19:35:58

标签: c++ visual-studio-2015 crash migration

我将现有的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

这是在调试器控制下发生的情况。否则,该应用程序将无法启动。

调试版本也有问题的行为。没有调试器,

enter image description here

并带有:

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位版本正常运行。

1 个答案:

答案 0 :(得分:0)

我进步很大。从这篇Mixed-mode C++/CLI crashing: heap corruption in atexit (static destructor registration)帖子中,我观察到确实该应用程序的入口点不是标准的,并且对其进行还原解决了崩溃问题。

现在仍然需要了解64位版本的速度。