【问题标题】:Why can't WinDBG find the mscordacwks.dll?为什么 WinDBG 找不到 mscordacwks.dll?
【发布时间】:2012-02-26 03:24:13
【问题描述】:

我正在尝试使用 WinDBG 分析来自我们的一台生产机器的故障转储。我的问题的根源似乎是我的 .NET 框架的构建与生产机器不同,只是我不知道如何解决这个问题。当我打开 !sym 嘈杂然后运行 ​​!dlk(from 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。

【问题讨论】:

  • 看起来您正在分析 .NET 2.0 程序集,但加载的 SOS 以 .NET 4.0 为目标。查看stackoverflow.com/questions/4373683/…
  • 使用“.chain”命令查看加载的扩展顺序。有时会加载两个版本 2.0 /4.0 sos dll,这可能会导致问题。

标签: windbg sos debugdiag


【解决方案1】:

这个非常完整的explanation by Doug Stewart 在这种情况下帮助了我。

总结:

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

【讨论】:

  • 谢谢..这也适用于 DebugDiag...复制到 C:\Program Files\DebugDiag
  • @diinesh-rajan,感谢您关注DebugDiag
【解决方案2】:

在这 2 个命令之后,一切都变好了:

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

【讨论】:

    【解决方案3】:

    在这里查看文章后http://codenasarre.wordpress.com/2011/06/22/sending-an-sos/

    然后基本上尝试了我可以移动的符号的每一个化身,我发现我能让这个工作的唯一方法是将 mscorwks.dll、mscordawks.dll 和 sos.dll 从生产机器复制到 C: \WINDOWS\Microsoft.NET\Framework\v2.0.50727

    WinDBG 似乎不能很好地处理同一个 DLL 的多个版本。也许我做错了什么,但将 dll 直接复制到 .NET Framework 目录至少可以让我启动并运行。

    【讨论】:

    • 这不是因为WinDbg不能处理多个版本的mscordacwks.dll,而是它使用设计算法来查询它们(因为它有很多补丁版本),这是你适应的风格积极地。一旦你习惯了这个事实,你以后就不会遇到太多麻烦了。
    【解决方案4】:

    我还发现使用 64 位版本的 windbg 并调试构建设置为“首选 32 位”的“任何 CPU”托管代码项目会导致此错误。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 2020-11-18
        相关资源
        最近更新 更多