43

我的一些应用程序有问题。它是在 Windows 2003 Server (x86) 的 IIS6 下运行的基于 wcf 的应用程序:
在事件日志中,我从“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。它没有帮助。

4

6 回答 6

45

这对我有用:

下载以下 DLL:

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

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

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

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

.load下载的 SOS.DLL 的路径

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

于 2012-04-17T15:30:33.233 回答
24

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 进行调试。

于 2011-09-15T14:54:07.120 回答
19

核心问题通常在于mscordacwks.dll版本不匹配(mscorwks.dll如果进行了完整转储,则不需要它本身)。从理论上讲,它应该可以从符号服务器获得 - 只需 run .cordll -ve -u -l。有关详细信息,mscordacwks.dll请参阅加载数据访问 DLL 失败,0x80004005” – 或 – 什么是 mscordacwks.dll

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

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

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

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

于 2014-04-23T12:34:09.493 回答
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
您的系统正在使用 version 运行4.0.30319.235

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

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

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

.load C:\CurrectFiles\sos

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

于 2012-05-22T13:27:07.450 回答
2

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

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

于 2013-12-12T10:08:00.137 回答
1

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

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

下面是一个例子:

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

>lm vm clr

它给了我

File version:     4.0.30319.18051

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

sos.dll 4.0.30319.18051

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

注意:有时获取所需的补丁很棘手,但在此示例中并非如此。

3.使用FAR 文件管理器,我从这个 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 的所有版本,每个版本都在其自己的目录中。有时 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.xxxdllmscordacwks_AMD64_AMD64_4.xxxdll

7.与它一起使用

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

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

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

于 2017-02-08T15:20:55.880 回答