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

gkn4icbw  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(246)

我的某些应用程序出现问题。这是在Windows 2003 Server(x86)中的IIS 6下运行的基于wcf的应用程序:
在事件日志中,我从“W3 SVC-WP”源(事件ID =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中打开小型转储时,我收到了相同的错误(“SOS的版本与您正在调试的CLR的版本不匹配”)。
我读过这篇文章-http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx,并尝试安装KB2518870。它没有帮助。

vvppvyoh

vvppvyoh1#

这就是我的工作:
下载下列DLL:

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

从生成转储的计算机上的以下文件夹:
C:\Windows\微软. NET\框架64\版本4.0.30319
运行以下命令。SOS.DLL的路径不应包含引号和未转义的路径分隔符:
.load * 下载的SOS.DLL* 的路径
我认为需要一个新的WinDbg会话才能正常工作。

vptzau2j

vptzau2j2#

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进行两柴。

vktxenjb

vktxenjb3#

核心问题通常在于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)和Psscor4PsscorSOS.dll的超集,它不会抱怨版本不匹配,只要您使用的是合适的主版本。应该注意的是,随着时间的推移,它的维护不如SOS.dll,因此后者可能包含前者所没有的增强和错误修复。在撰写本文时,.NET 4. 5还没有Psscor版本。

2ekbmq32

2ekbmq324#

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.dll以及mscordacwks.dllmscordwks.dll并在加载SOS时加载这些文件来避免错误。
原始文件通常位于:C:\Windows\微软. NET\框架\v4.0.30319
取决于框架版本...然后将它们复制到特定文件夹。
加载正确的文件,如下所示:

.load C:\CurrectFiles\sos

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

pdkcd3nj

pdkcd3nj5#

您可以自动加载正确的SOS.dll。
你也可以用.chain来检查已经加载了什么。在某些情况下,你必须先卸载(例如.unload sos)错误加载的dll。

vbopmzt1

vbopmzt16#

简而言之,请执行以下操作:
1.从转储中获取CLR版本
1.查找并下载适当的Microsoft补丁程序
1.从修补程序中提取 sos.dllmscordacwks.dll
1.使用它
下面是一个示例:

**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-KB 2833958-x64.msu

**注意:**有时候获取所需的修补程序很困难,但在本例中不是这样。
**3.**使用FAR file manager,我从该MSU中解压缩压缩文件:

  • Windows 8操作系统-RT-KB 2833958-x64.cab*
    **注意:**有时里面有几个文件柜,因此您需要检查哪个文件柜包含sos.dll。
    **注意:**有时补丁程序以.EXE格式分发,因此您首先需要解压缩MSU或MSP文件(我使用FAR执行此操作),然后从其中解压缩压缩文件。
    **4.**有时文件从CAB可以提取的FAR,但有时他们有非常不同的结构,我使用 Expand.exeWinAIK。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两个版本。我相信这是因为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.**将这些文件复制到包含大量 sos.4.x.x.x.dllmscordacwks_AMD64_AMD64_4.x.x.x.dll 的“C:\SOS\”文件夹
**7.**与以下内容一起使用

.load C:\SOS\sos.4.0.30319.18051.dll

**注意:**有时候对于.Net 4.5,您需要向mscordacwks版本mscordacwks_AMD64_AMD64_4.6.1055.00.dll而不是mscordacwks_AMD64_AMD64_4.6.1055.0. dll中添加额外得“0.”不过我没有深入研究,因为可以在很短得时间内处理此问题.

顺便说一句,如果找不到mscordacwks,WinDbg会说,并会指定版本(它将在结尾有两个“0”)。

相关问题