为什么WinDBG找不到mscordacwks.dll?

19
我正在尝试使用WinDBG分析我们生产机器之一的崩溃转储。我的问题根源似乎是我拥有不同版本的.NET框架,而生产机器上的版本不同,但我不知道如何解决这个问题。当我打开!sym noisy并运行!dlk(来自SOSEX)时,它尝试查找mscordacwks dll时出现以下错误。
0:000> !dlk
CLRDLL: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.3623 f:0
doesn't match desired version 2.0.50727.3607 f:0
SYMSRV:  c:\mysymbols\mscordacwks_x86_x86_2.0.50727.3607.dll\4ADD5446590000\mscordacwks_x86_x86_2.0.50727.3607.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscordacwks_x86_x86_2.0.50727.3607.dll/4ADD5446590000/mscordacwks_x86_x86_2.0.50727.3607.dll not found
SYMSRV:  c:\mysymbols\mscordacwks_x86_x86_2.0.50727.3607.dll\4ADD5446590000\mscordacwks_x86_x86_2.0.50727.3607.dll not found
SYMSRV:  c:\mysymbols\mscordacwks_x86_x86_2.0.50727.3607.dll\4ADD5446590000\mscordacwks_x86_x86_2.0.50727.3607.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscordacwks_x86_x86_2.0.50727.3607.dll/4ADD5446590000/mscordacwks_x86_x86_2.0.50727.3607.dll not found
SYMSRV:  c:\mysymbols\mscordacwks_x86_x86_2.0.50727.3607.dll\4ADD5446590000\mscordacwks_x86_x86_2.0.50727.3607.dll not found
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.3607.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_2.0.50727.3607.dll' on the path
SYMSRV:  c:\mysymbols\mscorwks.dll\4ADD5446590000\mscorwks.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscorwks.dll/4ADD5446590000/mscorwks.dll not found
SYMSRV:  c:\mysymbols\mscorwks.dll\4ADD5446590000\mscorwks.dll not found
DBGHELP: C:\Program Files\Debugging Tools for Windows (x86)\mscorwks.dll - file not found
SYMSRV:  c:\mysymbols\mscorwks.dll\4ADD5446590000\mscorwks.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscorwks.dll/4ADD5446590000/mscorwks.dll not found
SYMSRV:  c:\mysymbols\mscorwks.dll\4ADD5446590000\mscorwks.dll not found
CLRDLL: Unable to find mscorwks.dll by search
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.3607.dll, Win32 error 0n2
Unable to initialize .NET data interface. Version 2.0.50727.3607 of mscordacwks.dll is required.
Locate and load the correct version of mscordacwks.dll. See documentation for the .cordll command.

我从生产机器上取下了mscorwks.dll,mscordawks.dll和sos.dll并将它们放在C:\mysymbols中。WinDBG似乎正在寻找mscorwks dll内部的dll。


1
看起来您正在分析一个 .NET 2.0 程序集,但加载的 SOS 是针对 .NET 4.0 的。请访问 https://dev59.com/u2855IYBdhLWcg3wYjOF。 - Jason Evans
3
使用“.chain”命令查看加载扩展的顺序。有时会同时加载2.0/4.0版本的sos dll,这可能会导致问题。 - Naveen
5个回答

13

这篇由Doug Stewart撰写的非常详细的解释在这个情况下帮助了我。

总结:

  • 从原始系统获取mscordacwks.dll文件。
  • 将其重命名为类似于mscordacwks_AAA_AAA_2.0.50727.xxxx.dll的名称(根据您的体系结构和特定框架版本) - 例如,mscordacwks_x86_x86_2.0.50727.3607.dll是针对问题的特定情况。
  • 将该文件复制到windbg.exe目录中。

3
谢谢,这对DebugDiag也起作用了...已复制到C:\Program Files\DebugDiag。 - Dinesh Rajan
@diinesh-rajan,感谢您引起了我对DebugDiag的关注! - CodeFox

11

运行这两个命令后,一切都变得正常了:

0:000> .symfix
0:000> .reload

这很有帮助,比从原始系统中提取文件要容易得多,谢谢! - Arthur Stankevich

3

在查看此文章后,我尝试了各种移动符号的方式,最终发现唯一让它工作的方法是把生产机器上的mscorwks.dll、mscordawks.dll和sos.dll复制到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下。

似乎WinDBG无法处理同一DLL的多个版本。也许我做错了什么,但直接将dll文件复制到.NET Framework目录中至少让我能够正常运行。


这并不是因为WinDbg无法处理多个版本的mscordacwks.dll,而是它使用了按设计算法来查询它们(因为有很多补丁版本),这是你积极适应的风格。一旦你习惯了这个事实,你在未来就不会遇到太多麻烦了。 - Lex Li

3
我发现使用64位版本的windbg来调试“Any CPU”托管代码项目,如果构建设置为“prefer 32 bit”,将会导致此错误。

0
除了CodeFox的回答之外,您还需要将mscorwks.dll(如果您使用的是.NET 4+,则为clr.dll)所在的目录放入WinDbg中的图像文件路径(从文件菜单中选择)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接