gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:29:03 32 4
gpt4 key购买 nike

问题

有很多手动方法可以让 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 的优秀博客文章, 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 这里而不是 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 的方法)?

    最佳答案

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

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

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

  • 在 WinDBG 中执行 !sym noisy
  • 在 WinDBG 中执行 .cordll -ve -u -l
  • 在 WinDBG 中执行另一个 !CLRStack或其他 psscor2 命令(如有必要)强制它再次加载符号
  • 符号搜索日志将显示它正在寻找的 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 的子文件夹
  • 获得文件后,根据 WinDBG 正在查找的名称重命名它,例如“mscordacwks_AMD64_AMD64_2.0.50727.4216.dll”
  • 使用 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_
  • 将该压缩文件复制到符号存储中的预期位置。 (您在上面的第 4 步中找到了,因此在我们的运行示例中为 C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dl_。)
  • 关于clr - 可以让 WinDBG 在符号存储中找到 mscordacwks.dll 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19285748/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com