7

问题

有很多手动方法可以让 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这里而不是4E1545829a3000WinDBG 正在寻找的名称。

这样做的原因是,在将二进制文件添加到符号存储时,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 的方法)?

4

2 回答 2

5

由于没有出现其他解决方案,而且我的解决方法似乎可以很好地处理所有问题,因此我将继续这样做,并且我会建议其他任何不想Failed to load data access DLL, 0x80004005再次看到烦人的错误的人也这样做。

因此,要使这项工作为您(以及使用您的符号存储的每个人,所以我真的希望微软会这样做为我们大家省去很多麻烦)工作,只需将压缩的 DAC 文件 (mscordacwks.dl_) 手动放入正确的路径在您当地的 SYM 商店内。

以下是我执行此操作的步骤:

  1. 在 WinDBG 中做一个!sym noisy
  2. 在 WinDBG 中做一个.cordll -ve -u -l
  3. 如果需要,在 WinDBG 中执行另一个!CLRStack或其他 psscor2 命令以强制它再次加载符号
  4. 符号搜索日志将显示它正在寻找的 dll 以及它在符号存储中的位置,显示如下所示的行:C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll这表明两件事:
    • 您需要版本 2.0.50727.4216 的 64 位 mscordacwks.dll;有关获取它的方法,请参见https://stackoverflow.com/a/12024171/1910619
    • 它需要进入符号存储中名为 mscordacwks_AMD64_AMD64_2.0.50727.4216.dll 的文件夹下名为 4E1545829a3000 的子文件夹
  5. 获得文件后,根据 WinDBG 正在查找的名称重命名它,例如“mscordacwks_AMD64_AMD64_2.0.50727.4216.dll”
  6. 使用 makecab.exe 手动压缩此文件,如下所示:makecab /D CompressionType=LZX /D CompressionMemory=21 mscordacwks_AMD64_AMD64_2.0.50727.4216.dll mscordacwks_AMD64_AMD64_2.0.50727.4216.dl_
  7. 将该压缩文件复制到符号存储中的预期位置。(您在上面的步骤 4 中找到了,所以在我们的运行示例中是 C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dl_。)
于 2013-10-18T05:27:04.770 回答
3

您必须将 CLR dll 和关联的 mscordacwks dll 放在同一个文件夹中,并使用 symstore 注册 CLR dll。在这种情况下,symstore 将在符号存储中添加 clr 和 mscordacwks dll。

更重要的是,它将使用 clr dll 的时间戳和文件大小来创建 mscordacwks 子文件夹,因此 windbg 在调试转储时可以找到 mscordacwks dll。

mscordacwks 名称必须遵循 mscordacwks_ARCH_ARCH_fileversion 模式,否则 symstore 不会将其添加到符号存储中。

我没有找到有关该功能的任何文档,因此将来可能会删除它。

这是命令和 symstore 输出:

symstore.exe add /o /f 4.6.1076.00\clr.dll /t clr.dll /s \\mystore\microsoft
SYMSTORE MESSAGE: 0 alternate indexers registered
SYMSTORE MESSAGE: LastId.txt reported id 0
SYMSTORE MESSAGE: History.txt reported id 58228
SYMSTORE MESSAGE: Final id is 0000058228
SYMSTORE MESSAGE: Copying C:\Users\build.robot\symstore\4.6.1076.00\clr.dll to \\mystore\microsoft\clr.dll\56D79ED4990000\clr.dll [Force: T, Compress: F]
SYMSTORE MESSAGE: Copying 4.6.1076.00\mscordacwks_AMD64_AMD64_4.6.1076.00.dll to \\mystore\microsoft\mscordacwks_AMD64_AMD64_4.6.1076.00.dll\56D79ED4990000\mscordacwks_AMD64_AMD64_4.6.1076.00.dll [Force: T, Compress: F]

SYMSTORE: Number of files stored = 2
SYMSTORE: Number of errors = 0
SYMSTORE: Number of files ignored = 0
于 2016-08-31T22:34:33.507 回答