gpt4 book ai didi

c++ - 无法在 VS2015 下启动 64 位应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:26 25 4
gpt4 key购买 nike

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

这是在调试器控制下发生的事情。否则,应用程序不会启动。

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

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

最佳答案

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

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

关于c++ - 无法在 VS2015 下启动 64 位应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57013115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com