【问题标题】:Cannot lauch 64 bits application under VS2015VS2015下无法启动64位应用
【发布时间】: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:代码太大,无法显示。
  • 看看这是否有帮助:docs.microsoft.com/en-us/cpp/porting/…

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


【解决方案1】:

我取得了很大的进步。从Mixed-mode C++/CLI crashing: heap corruption in atexit (static destructor registration)这个帖子中,我观察到应用程序的入口点确实不标准,恢复它解决了崩溃问题。

现在还有待了解 64 位版本的慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2012-01-19
    相关资源
    最近更新 更多