.net “怎么办?”;SOS版本与您正在调试的CLR版本不匹配;在WinDbg?

.net “怎么办?”;SOS版本与您正在调试的CLR版本不匹配;在WinDbg?,.net,debugging,windbg,sos,minidump,.net,Debugging,Windbg,Sos,Minidump,我的一些应用程序有问题。它是一个基于wcf的应用程序,在Windows 2003 Server(x86)的IIS6下运行: 在事件日志中,我从“W3SVC-WP”源(EventID=2262)获得这样一个错误: 我在想到底发生了什么。我已经设置了为孤立工作进程创建转储,如本文所述。 发生死锁时,将创建一个小型转储。 然后我用这个小垃圾堆来了解发生了什么。这是我卡住了 我运行WinDbg x86,打开我的转储,然后: 0:037> .loadby sos clr 0:037> .sym

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

我在想到底发生了什么。我已经设置了为孤立工作进程创建转储,如本文所述。 发生死锁时,将创建一个小型转储。
然后我用这个小垃圾堆来了解发生了什么。这是我卡住了

我运行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中打开小型转储时,也会出现相同的错误(“SOS的版本与您正在调试的CLR的版本不匹配”)


我读过这篇文章-,并尝试安装。这没有帮助。

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

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


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

这就是我的工作原理:

下载以下DLL:

  • clr.dll
  • mscordacwks.dll
  • SOS.dll
从生成转储的计算机上的此文件夹:

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

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

.下载SOS.DLL的加载路径

我认为这需要一个新的WinDbg会话才能正常工作

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的安全更新更改了
CLR
SOS
文件。某些计算机可能还没有此更新

请参阅:

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

.load C:\CurrectFiles\sos

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

您可以自动加载正确的SOS.dll。查看约翰·罗宾斯的博客文章


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

核心问题通常在于不匹配的
mscordacwks.dll
版本(
mscorwks.dll
如果进行完全转储,则不需要它本身)。理论上,它应该可以从symbol服务器上获得—只需运行
.cordell-ve-u-l
。有关mscordacwks.dll的详细信息,请参见

不幸的是,mscordacwks.dll的某些版本尚未编制索引,这意味着上述方法并不总是有效。在这种情况下,如前所述,您可以尝试从进行转储的计算机上获取正确的版本(例如,从
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
)。获得它后,发出以下命令来加载它:
.cordell-u-ve-lp path tofoldercontainingmscordac
。当然,这台机器可能无法访问,或者可能在转储时就已经修补过了

幸运的是,有一个(它位于自解压可执行文件中的一个
cab
文件中-使用诸如之类的工具来解压它)。还有.NET更新的存储库(由MS员工Doug Stewart提供),因此您可以浏览它们以获得所需的确切版本号:

一旦您有了正确的
mscordacwks.dll
,在大多数情况下可以忽略
SOS.dll
警告,因为尽管有警告,最新的
SOS.dll
版本在大多数情况下仍能正常工作。然而,在某些情况下,还需要正确的
SOS.dll
版本(作为奖励,您可以摆脱讨厌的警告)。指向在这方面应该有帮助的的链接(基本上,您需要将符号服务器放置在
\NT\u symbol\u PATH
环境变量中,然后运行
!analyze–v
,而不首先加载
SOS.dll
,它将加载正确的版本本身)。如果这不起作用,您可以尝试从上述一个更新包中提取
SOS.dll
。可能更容易用于此目的,因为它专门索引
SOS.dll
版本


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

Psscor
版本。

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

  • 得到
    .load C:\CurrectFiles\sos
    
    >lm vm clr
    
    File version:     4.0.30319.18051
    
    mkdir Extracted
    ..\winaik_amd64\servicing\Expand.exe "%1" -F:sos.dll "Extracted"
    ..\winaik_amd64\servicing\Expand.exe "%1" -F:mscordacwks.dll "Extracted"
    
    .load C:\SOS\sos.4.0.30319.18051.dll