我有一个托管在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
答案 0 :(得分:1)
转储表明没有加载.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
BTW:ADPlus的-quiet
参数已过时,您可以省略它。