【问题标题】:C++\CLI applicatin crash on loadC++\CLI 应用程序在加载时崩溃
【发布时间】:2011-05-04 22:53:55
【问题描述】:

我有一个 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

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

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

由于您收到错误消息 “一个未处理的不可持续 处理过程中抛出异常 加载”,看来是问题造成的 通过一个与 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

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

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

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

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

【问题讨论】:

  • 你的 C++ DLL 的 DllMain 做了什么奇怪的事情?

标签: debugging c++-cli loading


【解决方案1】:

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

它现在就像一个魅力..

【讨论】:

    【解决方案2】:

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

    但是,我在 Microsoft Connect 上偶然发现了这个 posting,它提供了一种对我来说效果很好的解决方法。

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

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

    1. 进入可执行项目的“属性”对话框。
    2. 选择链接器-> 输入选项卡。
    3. 将混合模式 lib 文件添加到 Additional Dependencies 字段的开头。

    对于我的情况,这是最好的解决方案。它让我可以利用我的混合模式 dll,而无需做大量工作或造成巨大的 QA 负担。

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

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

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

    2. 右键单击该 cpp 文件。

    3. 选择属性。

    4. 选择常规选项卡

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

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

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

    【讨论】:

    • 哦,该死的,谢谢!我已经追了一段时间了。
    • 我不知道为什么,但改变链接顺序是我的问题的解决方案!谢谢
    【解决方案3】:

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

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

    【讨论】:

    • 有趣。我记得我在研究期间看到了一些 WinMM 参考资料,但我忽略了它们。 google.com/search?q=winmm+c%2B%2B%2Fcli+hangs 提供了一些有趣的链接。 WinMM 由 CPP DLL 之一加载。我从来没有想过我会遭受真正的 Windows 错误...
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 2019-09-25
      • 2018-08-26
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多