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

WinDbg:Dump表示无处使用的CLR版本,windbg,dump,sos,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* 然后加载从服务器复制的sos.dll:

我正在分析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*

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

0:000> .load D:\temp\dumps\sos.dll
这允许我列出线程使用!线程或手表堆栈使用!clrstack

但是使用时!体育或!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的符号文件加载到“我的符号”目录

.cordl的输出:

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从服务器复制到工作站,并使用.cordl加载运行时,但没有成功:

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
有人能解释一下这个版本控制问题吗?它是否与所使用的转储类型有关?

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

  • 将C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll从服务器计算机复制到开发人员计算机上的本地目录
  • 将C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll复制到将sos.dll复制到的同一目录中。然后将其重命名为mscordacwks_AMD64_AMD64_4.0.30319.01.dll
  • 加载复制的sos.dll版本——MSCORDARWKS将自动加载
    有关详细信息,请参见以下步骤:

    您是如何确定此版本号的:进行转储的服务器:4.0.30319.296?您是否在创建转储的同时执行此操作?如果您稍后执行此操作,则可能安装了更新,因此您的转储具有CLR 4…1,但与此同时.NET更新为4…296。我相信垃圾场的信息,这意味着你需要从某处获得SOS 4…1。