debugging - C++\CLI 应用程序在加载时崩溃

标签 debugging c++-cli loading

我有一个 C++ 应用程序,它加载大量 C++ DLL 和少数选定的 C++\CLI 的。在其中一台机器(Windows Server 2003 SP2)上启动时我收到错误消息

The application failed to initialize properly (0xC0000005). Click on OK to terminate the application.

当使用 WinDbg 打开应用程序而不是获得正确的 DbgBbreak 断点时,我得到了这个:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: d:\appdir\MyTrueApp.exe
Symbol search path is: .sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 00400000 0044b000   MyTrueApp.exe
ModLoad: 7c800000 7c8c3000   ntdll.dll
ModLoad: 77e40000 77f42000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 60200000 60264000   d:\AppDir\CustomCppDLL_ONE.dll
ModLoad: 76aa0000 76acd000   C:\WINDOWS\system32\WINMM.dll
ModLoad: 77380000 77411000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c00000 77c49000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7d1e0000 7d27c000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77c50000 77cf0000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 76f50000 76f63000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 10000000 10023000   d:\AppDir\CustomCppDLL_TWO.dll
ModLoad: 7c420000 7c4a7000   C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_179798C8\MSVCP80.dll
ModLoad: 78130000 781cb000   C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_179798C8\MSVCR80.dll
ModLoad: 77ba0000 77bfa000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 60300000 60332000   d:\AppDir\CustomCppDLL_3RD.DLL
ModLoad: 781d0000 782df000   C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_E87E0BCD\MFC80.DLL
ModLoad: 7d180000 7d1d2000   C:\WINDOWS\system32\SHLWAPI.dll
ModLoad: 77670000 777a9000   C:\WINDOWS\system32\ole32.dll
ModLoad: 77d00000 77d8b000   C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 00360000 00375000   d:\AppDir\CustomCppDLL_4th.DLL
ModLoad: 60800000 6081a000   d:\AppDir\CustomCppDLL_5th.DLL
ModLoad: 60600000 6074b000   d:\AppDir\CustomCppDLL_6th.DLL
ModLoad: 003b0000 003c5000   d:\AppDir\CustomCppDLL_7th.DLL
ModLoad: 77b90000 77b98000   C:\WINDOWS\system32\VERSION.dll
ModLoad: 00450000 004d6000   d:\AppDir\CustomCppDLL_7th.DLL
ModLoad: 7c8d0000 7d0cf000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 61880000 618bb000   C:\WINDOWS\system32\OLEACC.dll
ModLoad: 73070000 73097000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 762b0000 762f9000   C:\WINDOWS\system32\comdlg32.dll
ModLoad: 77530000 775c7000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.4770_x-ww_A689AB02\COMCTL32.dll
ModLoad: 004e0000 00506000   d:\AppDir\CustomCppDLL_9th.DLL
ModLoad: 00510000 00547000   d:\AppDir\CustomCppDLL_10th.DLL
ModLoad: 71c00000 71c17000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71bf0000 71bf8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 76cf0000 76d0a000   C:\WINDOWS\system32\iphlpapi.dll
ModLoad: 76b70000 76b7b000   C:\WINDOWS\system32\PSAPI.DLL
ModLoad: 6d580000 6d628000   C:\WINDOWS\system32\dbghelp.dll
ModLoad: 00560000 0056a000   d:\AppDir\CustomCpp_CLI.DLL
ModLoad: 79000000 7904a000   C:\WINDOWS\system32\mscoree.dll
ModLoad: 71bc0000 71bc8000   C:\WINDOWS\system32\rdpsnd.dll
ModLoad: 771f0000 77201000   C:\WINDOWS\system32\WINSTA.dll
ModLoad: 71c40000 71c97000   C:\WINDOWS\system32\NETAPI32.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
(1510.1304): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.

kc 的结果命令是

ntdll!LdrOpenImageFileOptionsKey
ntdll!LdrQueryImageFileExecutionOptionsEx
ntdll!LdrQueryImageFileExecutionOptions
ntdll!RtlIpv4StringToAddressExW
ntdll!RtlLogStackBackTrace
ntdll!LdrGetProcedureAddress
ntdll!EtwTraceMessage
ntdll!RtlIsThreadWithinLoaderCallout
ntdll!RtlGetActiveActivationContext
ntdll!RtlGetActiveActivationContext
ntdll!RtlGetActiveActivationContext
ntdll!RtlGetActiveActivationContext
ntdll!RtlGetActiveActivationContext
ntdll!RtlGetActiveActivationContext
ntdll!CsrClientConnectToServer
ntdll!KiUserApcDispatcher

Googling对于 ntdll!LdrOpenImageFileOptionsKey 表明它是 system loader 的一部分.除了看起来 one poor guy 之外,这里没有更多帮助有类似的问题,但没有解决方案。有once加载混合程序集时出现错误,但它适用于 Visual Studio 2003,我使用的是 2005 和 .NET Framework 2.0。

我绝望地尝试了.Net Framework repair但当然没有运气。我回到 Google得到了这个post这有一个小线索。它指出

Since you received the error message "An unhandled non-continuable exception was thrown during process load", it seems the problem is caused by a difficult issue related to DLL files. There are several discussions on this topic, maybe some of them can help:

  http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=325627&SiteID=1
  http://groups.google.com/group/microsoft.public.vc.mfc/browse_thread/thread/560a31bb72b2bca8/44fb800374c2f3b0%2344fb800374c2f3b0
  http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_thread/thread/1243abff27e677ae/901c0a23deec7e47%23901c0a23deec7e47

前两个链接没有用,但 last有人提到有类似问题的 /DELAYLOAD 链接器选项有帮助。通过将 CustomCpp_CLI.DLL 设置为可延迟加载,我得到了我的解决方案。我的应用rock'n'rolls现在!

我仍然不知道这有帮助的确切原因。另一方面,我的 C++ DLL 在 DllMain 和 Larry Osterman 中做了一些奇怪的事情。和 Raymond Chen写这个是scary .也许我的 DLL 以某种方式与加载程序混淆了?我不知道。

我把它写成 AAR (After Action Report)所以它会在谷歌结果中弹出,将来有一天会很糟糕,所以互联网is a better place.

顺便说一句,如果有人知道为什么 /DELAYLOAD 有帮助,请赐教。

最佳答案

我今天在 Windows 2003 SP2 服务器上遇到了类似的问题。我找到的解决方案是延迟加载有问题的 dll。

中所述

https://connect.microsoft.com/VisualStudio/feedback/details/586715/unmanaged-exe-linked-to-a-mixed-mode-dll-crashes-at-startup-on-some-xp-machines

我的主要应用程序是在 Delphi 2010 中,我在 delphi 中使用了延迟关键字,如

http://www.drbob42.com/examines/examinC1.htm

它现在就像一个魅力..

关于debugging - C++\CLI 应用程序在加载时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890796/

相关文章:

javascript - 在等待数据时触发 JavaScript-loader

使用高度属性在表格行上进行 CSS3 过渡

swift - 当我们在 Xcode 中执行程序时,有没有办法查看函数调用的顺序?

database - 五十一个数据库错误 - 重命名现有日志文件并且子进程退出并出现错误 100

.net - 有什么理由更喜欢 CefSharp 而不是 CefGlue(或反之亦然)?

在托管类中调用非托管函数时出现 C++/CLI System.AccessViolationException

apache-flex - 我可以构建 Adob​​e AIR 应用程序的调试版本吗?

c - Atof 不能在 C 中工作,没有 atof 也不能在调试中工作

C++/CLI 引发另一个对象的事件

javascript - 显示加载图标,直到表格加载完毕