WinDbg:转储表示无处使用的CLR版本

时间:2013-06-07 13:42:50

标签: windbg dump sos

我正在分析在Windows 8工作站上运行在Windows Server 2008上的IIS工作进程的内存转储。转储是使用任务管理器进行的小型转储。

服务器和工作站上的.Net Framework版本不同:

  • 工作站:4.0.30319.18046

  • 转储服务器:4.0.30319.296

我将sos.dll和mscordacwks.dll从服务器复制到专用目录中的工作站,然后在WinDbg中打开转储。

符号文件路径:SRV * c:\ dev \ symbols * http://msdl.microsoft.com/download/symbols

然后我加载从服务器复制的sos.dll:

0:000> .load D:\temp\dumps\sos.dll

这允许我使用!线程或使用!clrstack监视堆栈来列出线程。

但是当使用!pe或!clrstack时,我收到版本不匹配警告:

0:000> !pe
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.296
The current thread is unmanaged

虽然我可以看到对我感兴趣的堆栈,但我对警告中的CLR版本感到困惑:这个版本来自哪里?

当我执行

时,转储表示版本4.0.30319.1
lmv m clr

但在这种情况下无论是在服务器还是工作站上都​​没有使用4.0.30319.1。 或者我错过了什么?

此外,WinDbg将mscordacwks_AMD64_AMD64_4.0.30319.01.dll的符号文件加载到我的符号目录中。

输出.cordll:

0:000> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll:4.0.30319.18046 f:8
doesn't match desired version 4.0.30319.01 f:8
CLRDLL: Loaded DLL c:\dev\symbols\mscordacwks_AMD64_AMD64_4.0.30319.01.dll\4BA21EEB965000\mscordacwks_AMD64_AMD64_4.0.30319.01.dll
CLR DLL status: Loaded DLL c:\dev\symbols\mscordacwks_AMD64_AMD64_4.0.30319.01.dll\4BA21EEB965000\mscordacwks_AMD64_AM D64_4.0.30319.01.dll

我还尝试将clr.dll从服务器复制到我的工作站并使用.cordll加载运行时,但没有成功:

0:000> .cordll -u -lp D:\temp\dumps
CLRDLL: D:\temp\dumps\mscordacwks.dll:4.0.30319.296 f:8
doesn't match desired version 4.0.30319.01 f:8
CLRDLL: Unable to get version info for 'D:\temp\dumps\mscordacwks_AMD64_AMD64_4.0.30319.01.dll', Win32 error 0n87
CLRDLL: ERROR: Unable to load DLL D:\temp\dumps\mscordacwks_AMD64_AMD64_4.0.30319.01.dll, Win32 error 0n87
CLR DLL status: ERROR: Unable to load DLL D:\temp\dumps\mscordacwks_AMD64_AMD64_4.0.30319.01.dll, Win32 error 0n87

有人能解释这个版本问题吗?它是否与使用的转储类型有关?

1 个答案:

答案 0 :(得分:0)

对我有用的步骤(假设进程为64位):

  1. 将C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ SOS.dll从服务器计算机复制到开发计算机上的本地目录。
  2. 将C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ mscordacwks.dll复制到您将sos.dll复制到的目录中。然后将其重命名为mscordacwks_AMD64_AMD64_4.0.30319.01.dll。
  3. 加载复制的sos.dll版本 - 将自动加载mscordacrwks。
  4. 更多细节,此处描述了该过程:http://blogs.msdn.com/b/salvapatuel/archive/2010/03/09/how-to-configure-windbg-to-run-other-versions-of-the-net.aspx?Redirected=true