我正在分析在我的 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
这允许我使用 !threads 列出线程或使用 !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
任何人都可以对这个版本问题有所了解吗?它是否与使用的转储类型有关?