WinDBG可以在符号存储中找到mscordacwks.dll吗?

时间:2013-10-10 01:48:47

标签: clr windbg sos symstore sosex

问题

有很多手动方法可以让WinDBG在没有符号存储的情况下找到mscordacwks.dll(将文件放在路径的某处,将其放在与windbg.exe相同的文件夹中,将其放在我的Framework \ v文件夹中,指定WinDBG中使用.cordll -lp c:\dacFolder等的路径,但它们都只为 me 修复了它。我需要更频繁地为使用我的符号存储的每个人修复它。

我能想象的可能解决方案是:

  • 使用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的优秀博客文章What is 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 ,而不是WinDBG正在寻找的 4E1545829a3000

这样做的原因是,当向符号存储添加二进制文件时,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版本似乎都缺少微软的符号服务器。我确定它们在那里,只是WinDBG和psscor2无法找到它们,因为它们选择了错误的子文件夹名称。为什么它甚至困扰搜索符号路径是超出我的,因为它保证永远不会找到它!

这就是我的挑战。我可以以某种方式强制symstore.exe使用mscorwks.dll的PE信息添加mscordacwks.dll吗?如果没有,我错过了一些关于WinDBG和psscor2的东西,可能有一种方法让他们知道mscordacwks.dll的正确时间戳和大小,即使它没有被加载(并且他们实际使用它们的方式而不是mscorwks.dll )?

2 个答案:

答案 0 :(得分: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_。)

答案 1 :(得分: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