我正在分析在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.1lmv 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
有人能解释这个版本问题吗?它是否与使用的转储类型有关?
答案 0 :(得分:0)
对我有用的步骤(假设进程为64位):
更多细节,此处描述了该过程:http://blogs.msdn.com/b/salvapatuel/archive/2010/03/09/how-to-configure-windbg-to-run-other-versions-of-the-net.aspx?Redirected=true。