我在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
我做错了什么?
答案 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的建议继续操作。该工具应该已经适当地重命名了数据访问文件。如果您发现任何错误,欢迎提供反馈。