【问题标题】:What to do with "The version of SOS does not match the version of CLR you are debugging" in WinDbg?WinDbg中出现“SOS的版本与你正在调试的CLR版本不匹配”怎么办?
【发布时间】:2011-11-17 20:22:10
【问题描述】:

我的某些应用有问题。这是一个基于 wcf 的应用程序,在 Windows 2003 Server (x86) 的 IIS6 下运行:
在事件日志中,我从“W3SVC-WP”源(EventID=2262)收到这样的错误:

ISAPI 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll' reported itself as unhealthy for the following reason: 'Deadlock detected'.

我正在尝试弄清楚发生了什么。我已经按照KB 中的描述设置了为孤立工作进程创建转储。 当发生死锁时,会创建一个小型转储。
然后我用这个小型转储来尝试了解发生了什么。这就是我卡住了。

我运行 WinDbg x86,打开我的转储,然后:

0:037> .loadby sos clr
0:037> .sympath SRV*c:\temp\symbols*http://msdl.microsoft.com/download/symbols
Symbol search path is: SRV*c:\temp\symbols*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: srv*c:\temp\symbols*http://msdl.microsoft.com/download/symbols
0:037> !clrstack
The version of SOS does not match the version of CLR you are debugging.  Please load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 4.0.30319.1
SOS Version: 4.0.30319.235
CLRDLL: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.0.30319.235 f:8 doesn't match desired version 4.0.30319.01 f:8
CLRDLL: Loaded DLL c:\temp\symbols\mscordacwks_x86_x86_4.0.30319.01.dll\4BA1D9EF66f000\mscordacwks_x86_x86_4.0.30319.01.dll
OS Thread Id: 0x690 (37)
Unable to walk the managed stack. The current thread is likely not a managed thread.
You can run !threads to get a list of managed threads in the process

如何处理此错误 - “SOS 版本与您正在调试的 CLR 版本不匹配”?

我在 VS2010 中打开 minidump 时遇到同样的错误(“SOS 的版本与您正在调试的 CLR 的版本不匹配”)。

我已阅读这篇文章 - http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx,并尝试安装 KB2518870。没用。

【问题讨论】:

标签: .net debugging windbg sos minidump


【解决方案1】:

这对我有用:

下载以下 DLL:

  • clr.dll
  • mscordacwks.dll
  • SOS.dll

从生成转储的机器上的这个文件夹中:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

运行以下命令。 SOS.DLL 的路径应不带引号、未转义的路径分隔符:

.load 下载的 SOS.DLL 的路径

我认为这个工作需要一个新的 WinDbg 会话。

【讨论】:

  • 我使用 .load psscor4.dll 并按照您的建议从目标中获取 clr sos 和 mscordacwks。这为我解决了问题。
  • 如果我无法访问故障机器,我在哪里可以获得这些 DLL 的正确版本?我可以从正确的 Windows 更新(例如,this one)中找到这些 DLL,并下载了更新文件 (.msu)。但是当我解压.msu 文件时,它们只是一堆cabs 文件。我似乎记得有一个网站可以下载所有版本的 CLR 二进制文件。
  • 确保检查您尝试加载的转储的位数,上面的路径是 x64 clr,对于 x86 转储,请从 C:\Windows\Microsoft.NET\Framework\v4.0.30319 获取 dll
【解决方案2】:

WinDbg 将无法使用调试适配器 mscordacwks.dll,除非它与原始计算机的版本相同。您可以通过将此 DLL 从生成转储的目标计算机复制到您的 Debugging Tools for Windows 目录来解决此错误。

我们使用 WinDbg 调试 .NET 2.0 应用程序。关于 mscordacwks_x86_x86_2.0.50727.3615.dll,我们会不断收到同样的错误。我必须将此文件从服务器复制到我的客户端并将其放在 C:\Program Files\Debugging Tools for Windows (x86)\ 文件夹中。在那之后,WinDbg 不再抱怨了。

如果所有其他方法都失败了,您可以尝试在从中检索故障转储的同一台服务器上使用 WinDbg 进行调试。

【讨论】:

  • 谢谢。顺便说一句,似乎 .sympath 设置了全局提供的路径。
【解决方案3】:

核心问题通常在于mscordacwks.dll 版本不匹配(如果进行了完整转储,则不应需要mscorwks.dll 本身)。理论上,它应该可以从符号服务器获得——只需运行.cordll -ve -u -l。有关mscordacwks.dll 的更多信息,请参阅Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll

很遗憾,mscordacwks.dll 的某些版本尚未编入索引,这意味着上述内容并不总是有效。在这种情况下,您可以尝试从进行转储的机器上获取正确的版本,如提到的YocahiThomas(例如来自C:\Windows\Microsoft.NET\Framework64\v4.0.30319)。一旦你得到它,发出以下命令来加载它:.cordll -u -ve -lp PathToFolderContainingMscorDAC。当然,那台机器可能无法访问,或者在进行转储后它可能已经打了补丁。

幸运的是,有一个way to extract mscorwdacwks.dll from the actual update KB package(它位于自解压可执行文件内的cab 文件之一中 - 使用诸如7-Zip 之类的工具来解压它)。还存在 .NET 更新存储库(由 MS 员工 Doug Stewart 提供),因此您可以浏览它们以获取所需的确切内部版本号:

一旦您拥有正确的mscordacwks.dll,在大多数情况下可以忽略SOS.dll 警告,因为尽管有警告,最新的SOS.dll 版本大部分时间都可以正常工作。但是,在某些情况下,还需要正确的 SOS.dll 版本(作为奖励,您可以摆脱讨厌的警告)。 Dunken 链接到 blog post 应该在这方面有帮助(基本上你需要将符号服务器放在 _NT_SYMBOL_PATH 环境变量中并运行 !analyze –v 不加载 SOS.dll 首先- 它会自行加载正确的版本)。如果这不起作用,您可以尝试从上述更新包之一中提取SOS.dllThis site 可能更容易用于此目的,因为它专门索引 SOS.dll 版本。

最后,考虑PsscorR2(适用于.NET 2.0-3.5)和Psscor4(适用于.NET 4.0)。 PsscorSOS.dll 的超集,只要您使用适当的主要版本,它就不会抱怨不匹配的版本。应该注意的是,随着时间的推移,它的维护不如SOS.dll,因此后者可能包括前者所缺少的增强和错误修复。在撰写本文时,.NET 4.5 还没有 Psscor 版本。

【讨论】:

    【解决方案4】:
    The version of SOS does not match the version of CLR you are debugging.  Please load the matching version of SOS for the version of CLR you are debugging.
    CLR Version: 4.0.30319.1
    SOS Version: 4.0.30319.235
    

    这意味着进行转储的目标机器正在 CLR 版本 4.0.30319.1 上运行。
    您的系统运行版本为4.0.30319.235

    这是因为 .Net 4.0 的安全更新更改了 CLRSOS 文件。有些电脑可能还没有这个更新。

    请参阅:http://support.microsoft.com/kb/2572078

    这可能会导致堆栈中的某些行有点错误... 您可以通过获取SOS.dllCLR.dllmscordacwks.dllmscorwks.dll来避免错误> 原始版本,并在您加载 SOS 时加载它们。
    原始文件通常位于:C:\Windows\Microsoft.NET\Framework\v4.0.30319
    取决于框架版本...然后将它们复制到特定文件夹。
    像这样加载正确的文件:

    .load C:\CurrectFiles\sos
    

    请注意,它只是“sos”,而不是 sos.dll。

    【讨论】:

      【解决方案5】:

      您可以自动加载正确的 SOS.dll。查看 John Robbins 的精彩博文 http://wintellect.com/blogs/jrobbins/automatically-load-the-right-sos-for-the-minidump

      您也可以通过.chain 检查已加载的内容。在某些情况下,您必须先卸载(例如.unload sos)错误加载的 dll。

      【讨论】:

        【解决方案6】:

        简而言之,请执行以下操作:

        1. 从转储中获取 CLR 版本
        2. 查找并下​​载适当的 Microsoft 补丁
        3. 从补丁中提取sos.dllmscordacwks.dll
        4. 使用它

        下面是一个例子:

        1. 加载故障转储后,我得到了我需要的版本:

        >lm vm clr
        

        它给了我

        File version:     4.0.30319.18051
        

        2.我在 Google 上搜索包含此版本的 MS 更新:

        sos.dll 4.0.30319.18051

        在这种情况下,谷歌提供了一个带有下载链接的MS KB page。 我通常下载x64版本,因为它包含x86和x64 dll,所以我现在有Windows8-RT-KB2833958-x64.msu

        注意:有时很难获得所需的补丁,但在本例中并非如此。

        3. 使用FAR file manager,我从这个 MSU 中提取文件柜存档:

        Windows8-RT-KB2833958-x64.cab

        注意:有时候里面有好几个柜子,所以需要检查哪个柜子里面有sos.dll。

        注意:有时补丁以 .EXE 形式分发,因此您首先需要提取 MSU 或 MSP 文件(我使用 FAR 进行),然后从中提取文件柜。

        4. 有时 FAR 可以提取 CAB 中的文件,但有时它们的结构非常不同,我使用来自 WinAIKExpand.exe。 WinAIK 是 1.7 Gb ISO,但您只需要一小部分。 我使用以下 BAT 文件

        mkdir Extracted
        ..\winaik_amd64\servicing\Expand.exe "%1" -F:sos.dll "Extracted"
        ..\winaik_amd64\servicing\Expand.exe "%1" -F:mscordacwks.dll "Extracted"
        

        此命令提取指定 dll 的所有版本,每个版本都在其自己的目录中。 有时 mscordacwks.dll 和 sos.dll 都有 2 个版本。我相信这是因为 GRD/LDR(QFE) 员工。 在我们的示例中,有 4.0.30319.18051 和 4.0.30319.19079。 使用 Windows 资源管理器检查文件属性。

        5. 适当重命名文件:mscordacwks.dll 必须命名为 mscordacwks_%arch%_%arch%_%version%.dll em> 并放置在 sos.dll

        附近

        所以 mscordacwks.dll (4.0.30319.18051) 转到 mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

        (x86 版本重命名为 mscordacwks_x86_x86_4.0.30319.18051.dll

        sos.dll 可能保持原样,但我将其重命名为 sos.4.0.30319.18051.dll

        对 4.0.30319.19079 版本执行相同操作(以备将来可能需要)

        6. 将这些文件复制到 'C:\SOS\' 文件夹,其中包含大量 sos.4.xxxdllmscordacwks_AMD64_AMD64_4.xxxdll

        7.

        一起使用
        .load C:\SOS\sos.4.0.30319.18051.dll
        

        注意:有时对于 .Net 4.5,您需要在 mscordacwks 版本中添加额外的“0” mscordacwks_AMD64_AMD64_4.6.1055.00.dll 而不是 mscordacwks_AMD64_AMD64_4.6.1055.0.dll。不过我没有深入挖掘,因为可以在很短的时间内处理这个问题。

        顺便说一句,如果找不到 mscordacwks,WinDbg 会说并指定版本(最后会有双 '0')。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-03
          • 2016-03-03
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          • 2018-05-26
          • 1970-01-01
          相关资源
          最近更新 更多