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

时间:2011-05-04 22:53:56

标签: debugging c++-cli loading

我有一个C ++应用程序,可以加载很多C ++ DLL,很少选择C ++ \ CLI。在启动时的其中一台计算机(Windows Server 2003 SP2)上,我收到错误消息

  

应用程序无法正确初始化(0xC0000005)。单击“确定”以终止该应用程序。

当使用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
ntdll!LdrOpenImageFileOptionsKey的{​​{3}}表明它是Googling的一部分。除了似乎system loader有类似问题但没有解决方案之外,没有其他帮助。加载混合程序集时遇到one poor guy个错误,但它适用于Visual Studio 2003,我在2005年和.NET Framework 2.0上。

在纯粹的绝望中我试过once但当然没有运气。我回到.Net Framework repair并得到了Google这个有一点线索的人。它声明

  

因为您收到了错误消息   “一个未经处理的不可持续的   在处理期间抛出了异常   “负载”,似乎是问题造成的   与DLL相关的难题   文件。有几个讨论   关于这个话题,也许其中一些可以   求助:

  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

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

我仍然不知道为什么这会有所帮助。另一方面,我的C ++ DLL在DllMain中做了一些奇怪的事情,而lastLarry Osterman写的是Raymond Chen。也许我的DLL以某种方式与装载机混乱?我不知道。

我将其写为scary,因此它会在Google搜索结果中突然出现,并且将来会有一天会变得糟糕,所以互联网AAR (After Action Report)

BTW如果有人知道为什么/DELAYLOAD有所帮助,请启发我。

4 个答案:

答案 0 :(得分:4)

我今天在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

它现在就像一个魅力..

答案 1 :(得分:3)

我遇到了这个完全相同的问题并尝试了几种不同的策略,由于我正在使用的代码库问题,我最终不得不放弃这些策略。/ delayload策略对我来说不是一个选项。

但是,我偶然发现Microsoft Connect上的这个posting提供了一个对我来说相当不错的解决方法。

基本上,在链接到任何非托管C ++ dll的lib文件之前,非托管C ++可执行文件需要链接到混合模式C ++ dll的lib文件。

我通过以下方式指定了此选项:

  1. 进入可执行项目的“属性”对话框。
  2. 选择链接器 - >输入标签。
  3. 将混合模式lib文件添加到Additional Dependencies字段的开头。
  4. 对于我的情况,这是最好的解决方案。它让我可以利用我的混合模式dll,而不需要做大量工作或造成巨大的QA负担。

    另一个可行的解决方案,但对我正在使用的代码库没有用处,是使非托管C ++可执行文件成为混合模式可执行文件。

    要在不使整个exe成为CLR exe的情况下执行此操作...

    1. 将新的cpp文件添加到项目中。

    2. 右键单击该cpp文件。

    3. 选择属性。

    4. 选择常规标签

    5. 将公共语言运行时支持标志设置为/ clr。

    6. cpp文件可以为空,也不需要定义类。只需要在那里制作可执行的混合模式,以便正确链接所有内容。

      希望其中一个解决方案可以帮助将来的某个人,这样他们就不必花费大量时间来解决这个问题。

答案 2 :(得分:2)

我遇到了一个类似的问题,C ++ / CLI应用程序在启动期间崩溃并且它也非常模糊,我花了一些调试和谷歌搜索,发现罪魁祸首是WinMM DLL(Windows多媒体库)在它的入口点函数中做了一些“不安全”的东西(namelly多次调用“FreeLibrary” - 我认为在文档中明确标记为不安全的东西)。 我确实在Microsoft网站上找到了一些知识库文章或帖子,并且解决方案是 - 如你的情况 - 动态加载DLL(与/ DELAYLOAD开关具有相同的效果)而不是静态链接到它。

在您的情况下,我看到您还加载了WinMM库。它是由您的应用程序直接加载还是通过CustomCpp_CLI模块进行indireclty加载?知道你是否有同样的问题会很有趣,但无论如何似乎一般规则是静态链接到C ++ / CLI项目中的一些“行为不端”的DLL是不安全的。

答案 3 :(得分:0)

我看到你加载winsta.dll - MSDN论坛上的一个问题(与我正在开发的服务器应用程序相同)显示XP / 2003上的终端服务导致C ++ / CLI混合模式DLL的加载错误(至少对于TS会话上的CLR2)。解决方法是使用VNC /类似。