使用托管C ++库时WS2_32.dll_unloaded异常

Ric*_*Liu 0 c++ dll windows-server-2008-r2

是否有人对以下崩溃的含义或调试方法有任何想法?

错误的应用程序名称:MyServer.exe,版本:0.0.0.0,时间戳:0x53d885f1

故障模块名称:WS2_32.dll_unloaded,版本:0.0.0.0,时间戳:0x4ce7ca25

异常代码:0xc0000005

故障偏移量:0x000007fefe67a0af

故障进程ID:0xcbc

错误的应用程序开始时间:0x01cfabbc216f52c2

错误的应用程序路径:[Path] /MyServer.exe

错误的模块路径:WS2_32.dll

报告ID:61efadce-17af-11e4-8301-001517d9c80a

当我将我的exe(非托管C ++)与托管C ++ dll(通过dllexport公开)链接时,就会发生这种情况。从windbg看来,崩溃是在加载所有模块之后立即发生的,甚至没有发生过:

(51d4.5e50):访问冲突-代码c0000005(第一次机会)在任何异常处理之前都会报告第一次机会异常。可能会预期并处理此异常。+ 0x1a0af:000007fe fe67a0af ?? ??? 0:000> kP Child-SP RetAddr Call Site 000000000020dc80 00000000 002a2700 <Unloaded_WS2_32.dll>+0x1a0af 000000000020dc88 00000000 002a2701 0x2a2700 000000000020dc90 00000000`00000000 0x2a2701

托管的C ++ dll是一个DNS库,它最终在下面调用WS2_32.dll。

奇怪的是,另一个使用相同托管C ++ dll的exe可以正常运行,并且我没有发现源/头文件之间的明显差异会导致这种不同的行为。如果我注释掉了(1)引用此托管dll的代码,或(2)我的exe文件中除引用托管dll的代码之外的所有其他内容,那么也不会发生崩溃。(2)工作的事实告诉我,至少所有dll依赖项都应该在工作目录中。

仅在Windows Server 2008 R2上会发生这种情况。我正在使用.Net 4.5。

有人有指针吗?

Vip*_*ipB 5

我有一个类似的问题,涉及一个使用许多DLL的本机应用程序,其中一个被管理。应用程序无法访问main的事实表明DLL的DllMain返回FALSE。但是,尽管事件查看器中的日志显示的错误消息与OP提供的错误消息相似,但我不知道是哪一个。对我来说幸运的是,该应用程序仅在新建PC上失败。为尝试调试问题而执行的操作:

  • 使用加载程序快照来跟踪DLL加载过程。与WinDbg结合使用,这表明一个DLL失败,原因是一堆未初始化的DLL包含了所有运行了其初始化程序的DLL。它没有显示每个DLL的DllMain的实际返回值。
  • 使用Dependency Walker的分析选项来跟踪DllMains的返回值。但是,这种挂起的效果并不明显。
  • 在两台计算机上使用ProcMon捕获启动,并比较跟踪。在检查了注册表项之后,这更加富有成果,并且在两者之间表现出不同的行为HKLM\Software\Microsoft\SQMClient\Windows\CEIPEnable。在工作情况下CEIPEnable为0。在失败情况下CEIPEnable为1。这就是nop提到的Windows客户体验改善计划。禁用此功能可以在有故障的计算机上启动应用程序。
  • 使用AppVerifier捕获WSAStartup在其DllMain 中调用的那些DLL(在调试器下运行时)。这确实标记了可疑的DLL(以及其他)。此行为与Richard指出的MSDN的建议相反。

进一步的观察:

  • 如果我在好的计算机上启用了CEIP,则该应用程序仍将成功启动。因此,导致故障的原因还必须包括其他因素。
  • Microsoft日本有一篇有关此问题的文章,其中将禁用CEIP列为解决方法。链接的文章为日语,但Google可以翻译。
  • 托管DLL似乎不是问题。

我希望有人觉得这个答案有用。如果没有nop的答案,我不会解决我的问题。