我正在使用WinDbg来查看进程转储。转储已在具有.NET 4 SP1(4.0.30319.237)的x86服务器上进行。我正在尝试使用x86版本的WinDbg在我的x64机器上进行调试,但是我遇到了以下问题。
0:000> !EEVersion
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.237
SOS Version: 4.0.30319.239
4.0.30319.237 retail
Workstation mode
SOS Version: 4.0.30319.239 retail build
由于我的机器已采用最近的安全补丁,SOS DLL文件现在版本为4.0.30319.239,因此我无法在WinDbg中使用任何CLR扩展。我已连接到Microsoft符号服务器并获得了mscordacwks.dll
的正确版本。
我在哪里可以获得SOS.dll版本4.0.30319.237的副本?
我上网的最佳匹配是 Reliability Update 1 for the .NET Framework 4 。但是,这不能安装在我的机器上(我没有第二个),因为它已经被超越了。
梦魇!
答案 0 :(得分:6)
我的情况差不多。
0:000> !EEVersion
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.235
SOS Version: 4.0.30319.239
4.0.30319.235 retail
Workstation mode
SOS Version: 4.0.30319.239 retail build
我已经下载并使用了psscor4,它没有抱怨,而且堆栈看起来很合理
0:000> !psscor4.EEVersion
4.0.30319.235 retail
Workstation mode
SOS Version: 4.0.0.4 retail build
0:000> !psscor4.DumpStack
OS Thread Id: 0x874 (0)
Current frame: ntdll!KiFastSystemCallRet
ChildEBP RetAddr Caller,Callee
002ec6c8 77d16a24 ntdll!NtWaitForSingleObject+0xc
002ec6cc 758e6f0f mswsock!SockWaitForSingleObject+0x1ba , calling ntdll!NtWaitForSingleObject
002ec70c 758e65cc mswsock!SockDoConnectReal+0x2c3 , calling mswsock!SockWaitForSingleObject
002ec77c 71a63267 clr!GetCompileFlags+0x144 , calling clr!_EH_epilog3
002ec780 76ee2f7d ws2_32!WahReferenceContextByHandle+0x63
002ec7a4 758e5fac mswsock!SockDoConnect+0x3a1 , calling mswsock!SockDoConnectReal
002ec7e4 76a82c6a kernel32!FlushInstructionCache+0x18 , calling ntdll!ZwFlushInstructionCache
你可以尝试一下!
答案 1 :(得分:5)
我找到解决此问题的唯一方法是从生成转储的计算机中获取SOS.dll。我现在已经发生了几次,这是唯一对我有用的解决方案。 MS确实不会在符号服务器上放置所有版本的SOS.dlls,这真令人讨厌。
答案 2 :(得分:5)
如果您的分析计算机上没有安装与在转储计算机上运行的完全相同的.NET版本,那么您真正需要的不只是SOS.dll
转储机。
获取以下程序集:sos.dll
,mscordacwks.dll
和(可能)mscorwks.dll
(如果是.NET 2)或clr.dll
(.NET 4)。
将它们全部放在分析机器上的目录中。以下示例假定为C:\Debug
。
复制,然后重命名mscordacwks机器以反映平台和内部版本号。请记住,如果不是来自Itanium,则此上下文中的64位通常必须命名为AMD64
。
示例:
mscordacwks_x86_x86_2.0.50727.3625.dll
或
mscordacwks_AMD64_AMD64_4.0.30319.269.dll
打开WinDbg,将该目录添加到执行路径,以便找到重命名的mscordacwks
。
示例:“。expand / C:\ Debug”
明确加载匹配的SOS
示例:“。load C:\ Debug \ sos”
快乐的调试!