问题
有很多手动方法可以让 WinDBG 在没有符号存储的情况下找到 mscordacwks.dll(将文件放在路径中的某个位置,将其放在与 windbg.exe 相同的文件夹中,将其放在我的 Framework\v 文件夹中,指定路径WinDBG 使用.cordll -lp c:\dacFolder
等),但他们都只为我修复它。我需要为使用我的符号存储的每个人更普遍地修复它。
我能想象的可能的解决方案是:
- WinDBG 使用 mscordacwks.dll 的子文件夹名称而不是 mscorwks.dll 的文件夹名称来检查符号存储。
- SymStore.exe 被添加到 mscorwks.dll 的子文件夹名称下的 mscordacwks.dll,以便 WinDBG 找到它。
问:这些事情中的任何一个都是可能的,还是有其他我没有想到的解决问题的方法?
的背景
在分析 .NET 进程时,我遇到了 psscor2(和 sosex)无法在我的机器上找到合适的 mscordacwks.dll 的(显然很常见的)问题。WinDBG 中的错误是:
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 mscorwks.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 mscorwks.dll as well.
有很多关于这个的问题和很多好的答案,实际上所有这些最终都参考了 Doug Stewart 的优秀博客文章,什么是 mscordacwks.dll?.
多亏了这一点,我通过获取正确的 mscordacwks.dll 并将其放置在此处来解决所有问题:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"
我知道 WinDBG 会出现在哪里,因为我之前用!sym noisy
.
所以我现在已经准备好了,但是我必须将它物理地放在那个路径中,而不是通过正常symstore.exe
机制将它添加到我的符号服务器中。由于我的符号存储不仅仅是我自己使用的,因此我需要以正确的方式为使用该存储的其他人做这件事。
这就是问题所在。当我添加使用symstore.exe
而不是进入上述路径时,它进入:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545CB1bd000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"
唯一的区别是子文件夹名称在4E1545CB1bd000
这里而不是4E1545829a3000
WinDBG 正在寻找的名称。
这样做的原因是,在将二进制文件添加到符号存储时,symstore.exe
使用二进制文件的 PE 来获取图像时间戳和图像大小。在这个特定的 .dll 的情况下,dumpbin.exe /headers mscordacwks.dll
显示这些是:
- 图片时间戳:
0x4E1545CB
(2011 年 7 月 7 日星期四 01:36:11) - 图片尺寸:
0x1BD000
因此,子文件夹名称4E1545CB1BD000
。
另一方面,WinDBG 正在寻找的是基于图像时间戳和图像大小的子文件夹mscorwks.dll,而不是mscordacwks.dll,因为前者被加载到进程中,而不是后者。WinDBG 无法知道 DAC 模块的时间戳和大小,因为该模块不在进程转储中。
作为对这一解释的进一步验证,dumpbin.exe /headers mscorwks.dll
揭示:
- 图片时间戳:
0x4E154582
(2011 年 7 月 7 日星期四 01:34:58) - 图片尺寸:
0x9A3000
您可以看到添加到子文件夹名称4E1545829A3000
。
知道了这一点,现在人们就更明白为什么人们经常遇到的所有这些 mscordacwks.dll 版本似乎都从 Microsoft 的符号服务器中丢失了。我确定它们在那里,只是 WinDBG 和 psscor2 找不到它们,因为它们选择了错误的子文件夹名称。为什么它甚至会费心搜索符号路径,这超出了我的理解,因为它保证永远找不到它!
所以这就是我的挑战。我可以symstore.exe
使用 mscorwks.dll 的 PE 信息以某种方式强制添加 mscordacwks.dll 吗?如果没有,我是否遗漏了有关 WinDBG 和 psscor2 的信息,是否有办法让他们知道 mscordacwks.dll 的正确时间戳和大小,即使它没有加载(以及让他们实际使用这些而不是 mscorwks.dll 的方法)?