要加载哪个版本的 sos 和 clr/mscorwks.dll?

Which version of sos and clr/mscorwks.dll to load?

我在 64 位计算机上托管了一个 32 位应用程序(针对 .NET 3.5)。我想分析这个 32 位应用程序的内存转储。我使用 32 位 adplus 和 cdb 捕获了内存转储。我正在将内存转储加载到 32 位 windbg 中。当我将 .net 2.0 sos.dll 和 .net 2.0 mscorwks.dll 加载到 windbg 并执行 !clrstack 时,出现以下错误:“找不到运行时 DLL (mscorwks.dll),0x80004005 扩展命令需要 mscorwks.dll 才能执行某些操作。”我做错了什么?

评论中要求的信息

ADPlus 命令行:

adplus -hang -quiet -p 2440 -o C:\temp

WinDbg 命令:

0:000> .load <fullpathto>\sos.dll

0:000> lmvm mscorwks
start    end        module name

0:000> .exr -1
ExceptionAddress: 00000000
   ExceptionCode: 80000007 (Wake debugger)
  ExceptionFlags: 00000000
NumberParameters: 0

转储表明没有加载 .NET 2。否则 lmvm mscorwks 的输出应该显示 .NET 运行时的详细信息,如下所示:

0:003> lmvm mscorwks
start    end        module name
61bc0000 6216e000   mscorwks   (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
    ...
    File version:     2.0.50727.5485
    ...

您提到您通过完整路径加载了 SOS。如果转储是在您的机器上进行的,您通常会使用

加载它
0:003> .loadby sos mscorwks    

在您的情况下,这应该已经提示您未加载 .NET:

Unable to find module 'mscorwks'

如果您不太确定 .NET 版本,请尝试

.loadby sos clr; *** .NET 4
.loadby sos coreclr; *** Silverlight / Universal Apps

也许您在 AdPlus 命令行中输入错误并指定了错误的进程 ID。如果该 PID 意外存在,则转储错误。使用|检查进程名称

0:003> |
.  0    id: 1e78    attach  name: E:\...\NET2x32.exe

顺便说一句:ADPlus的-quiet参数已经过时了,可以省略。