调试在64位环境中运行的32位应用程序

时间:2014-02-18 11:43:48

标签: c# debugging windbg sos

我在64位计算机的wow64环境中运行了32位.Net 4.0应用程序。

应用程序遇到错误,我在C:\ Windows \ SysWOW64 \ taskmgr.exe中使用32位taskmanager进行转储

我正在使用32位Windebugger来分析这个转储。我加载了下面的dll。

1).loadby sos CLR

2).load mscordacwks(来自客户机)。

但我仍然无法使用像!clrstack,!threads等的SOS命令。

我收到错误: 无法加载数据访问DLL,0x80004005

我做错了什么?

2 个答案:

答案 0 :(得分:2)

似乎没有正确加载mscordacwks

单程

尝试:

.cordll -u -ve -lp <absolute-path-to-directory-where-client-mscordacwks-is-placed>

正确的输出应该是:

CLRDLL: Loaded DLL <your-path>\mscordacwks.dll
CLR DLL status: Loaded DLL <your-path>\mscordacwks.dll

如果你看到:

CLR DLL status: No load attempts

将您的mscordacwks重命名为.cordll建议的名称:

0:000> .cordll
CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.3625.dll, Win32 error 0n87

并将重命名的mscordacwks所在的路径添加到符号中:

.sympath+ <your-path>

并尝试使用SOS命令。

其他方式

从Andrew Richard的skydrive获取procdumpext.dll:http://sdrv.ms/11C7S9c,将其加载到windbg(.load procdumpext.dll)并执行!loadsos

祝你好运! :)

答案 1 :(得分:2)

我得到了最好的结果,以防我从客户端计算机上获取mscordacwks.dll和sos.dll。我甚至对这些文件存在SxS问题,因此从默认的.NET框架目录中获取文件也没有用。因此,我创建了mscordacwks collector,它可以为您获取所有可能的文件。

但是,您仍需要找出要使用的版本。您可以从查看.NET框架版本开始:

lm vm clr; *** .NET CLR 4
lm vm mscorwks; *** .NET CLR 2
lm vm coreclr; *** Silverlight

(在最坏的情况下,您加载了两个不同版本的.NET,在这种情况下you are out of luck)。

一旦知道确切的版本,就可以通过完整路径加载该版本的SOS

.load c:\mypath\SOS_AMD64_AMD64_4.0.30319.18444.dll

请注意,收集的SOS.dll版本也将重命名,以避免文件名冲突。为方便起见,您可以创建副本并将其重命名为SOS.dll。

如果仍然存在任何mscordacwks.dll问题,您可以按照@lowleveldesign的建议继续操作。该工具应该已经适当地重命名了数据访问文件。如果您发现任何错误,欢迎提供反馈。