我正在调试一个运行在x64机器上的进程的32位进程转储。我在x64笔记本电脑上运行的是x86版本的windbg。我遵循了这里的建议,但我仍然得到这个:
0:000> .cordll -ve -u -l
CLR DLL status: No load attempts
0:000> !clrstack
CLRDLL: C:WindowsMicrosoft.NETFrameworkv4.0.30319mscordacwks.dll:4.0.30319.17020 f:8
doesn't match desired version 4.0.30319.237 f:8
CLRDLL: Loaded DLL c:symbolspublicmscordacwks_x86_x86_4.0.30319.237.dll4DD234A8670000mscordacwks_x86_x86_4.0.30319.237.dll
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of clr.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.
据我所知,mscordacwks_x86_x86_4.0.30319.237.dll
已成功加载,但我仍然得到错误。我错过了什么?
我通过使用ProcDump来获得在64位机器上运行的32位进程的32位转储来解决这个问题。我可以使用32位的windbg成功地检查它。
看起来您有一个32位的转储文件-否则错误将看起来像
CLR DLL status: ERROR: Unable to load DLL mscordacwks_AMD64_x86_2.0.50727.3053.dll, Win32 error 0n87
至少这是根据博客文章"加载数据访问DLL失败,0x80004005"-或-什么是mscordacwks.dll?从一个黑暗角落的博客的笔记。
请注意错误信息中AMD64_x86和x86_x86的混合。
对我来说,这总是因为我没有正确的mscordacwks版本。也有可能是风找不到它。请参阅我在windbg中对问题调试挂起转储的回答,了解我用于从安全补丁中查找/提取正确版本的一种方法。为了让windbg加载它,我设置了windbg的映像路径,使其指向我存储它的目录。