在WinDbg中如何处理“SOS版本与您正在调试的CLR版本不匹配”?

时间:2011-09-15 12:24:58

标签: .net debugging windbg sos minidump

我的某些应用程序出现问题。它是一个基于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中的描述为Orphan Worker Process设置了转储。 当发生死锁时,会创建一个小型转储 然后我拿这个小型泵试图了解发生了什么。这是我被困住了。

我运行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版本不匹配”?

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

我已阅读此帖子http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx,并尝试安装KB2518870。它没有帮助。

6 个答案:

答案 0 :(得分:44)

这对我有用:

下载以下DLL:

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

来自生成转储的计算机上的此文件夹:

  

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

运行以下命令。 SOS.DLL的路径应该没有引号,未转义的路径分隔符:

  

.load 下载SOS.DLL的路径

我认为需要新的WinDbg会话才能实现。

答案 1 :(得分:24)

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

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

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

答案 2 :(得分:19)

核心问题通常在于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版本(作为奖励,你可以摆脱讨厌的警告)。 Dunkenblog post链接应该对此有所帮助(基本上您需要将符号服务器放在_NT_SYMBOL_PATH环境变量中并运行!analyze –v 而不加载 SOS.dll首先 - 它将加载正确的版本本身)。如果这不起作用,您可以尝试从其中一个更新包中提取SOS.dll,如上所述。 This site可能更容易用于此目的,因为它专门索引SOS.dll版本。

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

答案 3 :(得分:8)

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.dll CLR.dll mscordacwks.dll mscorwks.dll 原始版本的>加载SOS时加载 原始文件通常位于: C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319
取决于框架版本...然后将它们复制到特定文件夹 像这样加载正确的文件:

.load C:\CurrectFiles\sos

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

  1. 从转储
  2. 获取CLR版本
  3. 查找并下​​载相应的Microsoft补丁
  4. 从补丁中提取 sos.dll mscordacwks.dll
  5. 使用它
  6. 以下是一个例子:

    1。加载崩溃转储后,我得到了我需要的版本:

    >lm vm clr
    

    它给了我

    File version:     4.0.30319.18051
    

    2. 我谷歌搜索包含此版本的MS更新:

    sos.dll 4.0.30319.18051

    在这种情况下,Google会为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. 有时来自CAB的文件可以通过FAR提取,但有时它们具有非常不同的结构,我使用WinAIK中的 Expand.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的所有版本,每个版本都在其自己的dir中。 有时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 并放置在 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.x.x.x.dll mscordacwks_AMD64_AMD64_4.x.x.x.dll

    的文件夹

    7。

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

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

    BTW,WinDbg会说如果找不到mscordacwks并且会指定版本(最后会有两倍的' 0')。