我的某些应用程序出现问题。这是在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。它没有帮助。
6条答案
按热度按时间vvppvyoh1#
这就是我的工作:
下载下列DLL:
从生成转储的计算机上的以下文件夹:
C:\Windows\微软. NET\框架64\版本4.0.30319
运行以下命令。SOS.DLL的路径不应包含引号和未转义的路径分隔符:
.load * 下载的SOS.DLL* 的路径
我认为需要一个新的WinDbg会话才能正常工作。
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进行两柴。
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
的一些版本没有被索引,这意味着上面的方法并不总是有效。在这种情况下,你可以尝试从转储的机器上获取正确的版本,如Yocahi和Thomas所提到的(例如从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.dll
。This site可能更容易用于此目的,因为它专门索引SOS.dll
版本。最后,考虑PsscorR2(适用于.NET 2.0-3.5)和Psscor4
Psscor
是SOS.dll
的超集,它不会抱怨版本不匹配,只要您使用的是合适的主版本。应该注意的是,随着时间的推移,它的维护不如SOS.dll
,因此后者可能包含前者所没有的增强和错误修复。在撰写本文时,.NET 4. 5还没有Psscor
版本。2ekbmq324#
这意味着生成转储的目标计算机正在CLR版本
4.0.30319.1
上运行。您的系统正在运行
4.0.30319.235
版本。这是因为.Net 4.0的安全更新更改了
CLR
和SOS
文件。某些计算机可能尚未安装此更新。请参阅:http://support.microsoft.com/kb/2572078
这可能会导致堆栈中的某些行有点错误...您可以通过获取原始版本的SOS.dll和CLR.dll以及mscordacwks.dll和mscordwks.dll并在加载SOS时加载这些文件来避免错误。
原始文件通常位于:C:\Windows\微软. NET\框架\v4.0.30319
取决于框架版本...然后将它们复制到特定文件夹。
加载正确的文件,如下所示:
请注意,它只是“sos”而不是sos.dll。
pdkcd3nj5#
您可以自动加载正确的SOS.dll。
你也可以用
.chain
来检查已经加载了什么。在某些情况下,你必须先卸载(例如.unload sos
)错误加载的dll。vbopmzt16#
简而言之,请执行以下操作:
1.从转储中获取CLR版本
1.查找并下载适当的Microsoft补丁程序
1.从修补程序中提取 sos.dll 和 mscordacwks.dll
1.使用它
下面是一个示例:
**1.**载入损毁倾印后,我取得所需的版本:
它给了我
**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中解压缩压缩文件:
**注意:**有时里面有几个文件柜,因此您需要检查哪个文件柜包含sos.dll。
**注意:**有时补丁程序以.EXE格式分发,因此您首先需要解压缩MSU或MSP文件(我使用FAR执行此操作),然后从其中解压缩压缩文件。
**4.**有时文件从CAB可以提取的FAR,但有时他们有非常不同的结构,我使用 Expand.exe 从WinAIK。WinAIK是1.7 Gb ISO,但你只需要一小部分。我使用以下BAT文件
这个命令会解压缩指定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.dll 和 mscordacwks_AMD64_AMD64_4.x.x.x.dll 的“C:\SOS\”文件夹
**7.**与以下内容一起使用
**注意:**有时候对于.Net 4.5,您需要向mscordacwks版本mscordacwks_AMD64_AMD64_4.6.1055.00.dll而不是mscordacwks_AMD64_AMD64_4.6.1055.0. dll中添加额外得“0.”不过我没有深入研究,因为可以在很短得时间内处理此问题.
顺便说一句,如果找不到mscordacwks,WinDbg会说,并会指定版本(它将在结尾有两个“0”)。