【问题标题】:Crash dump - WinDbg - force PDB files to match doesn't work?故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?
【发布时间】:2014-03-20 03:05:32
【问题描述】:

我有一个客户应用程序的故障转储,该应用程序是使用我们在 WinDbg 中分析的非常旧版本的 dll(发布版本,没有原始符号)构建的。

为了获得更多信息,我在发布模式下重新构建了 dll,这次使用符号,使用相同的编译器版本,我相信与最初构建 dll 时相同的设置。我将符号文件添加到我的符号路径中,但 WinDbg 扩展名 !itoldyouso 告诉我转储中的模块与 PDB 文件不匹配。启用 SYMOPT_LOAD_ANYTHING 也无济于事。

!itoldyouso 告诉我它们不匹配,因为模块没有 pdb sig(值 0),而我创建的重新创建的符号文件(具有有效的 pdb sig)。如何让它们匹配?

【问题讨论】:

    标签: debugging windbg symbols crash-dumps


    【解决方案1】:

    很遗憾,您的 DLL 没有匹配的符号 :(。据我了解,现在的任何尝试都无法为您提供完全匹配的 PDB。

    回收一些应该有帮助的旧线程:

    Is it possible to (re)create a PDB file after a DLL is made

    Tool to find if dll (or) exe and PDB file match

    你最好的选择是

    一个。将您的代码同步回 DLL 发布的时间

    b.使用相同的工具集构建和创建 PDB。

    c。使用 .reload /i 选项加载符号

    【讨论】:

      【解决方案2】:

      你试过.reload /i foo.dll吗?

      对于详细输出尝试:

      !sym noisy;.reload /i foo.dll;x foo!*test*

      【讨论】:

      • 是的,它加载了 foo 的符号,但是在详细的输出中我也看到了不匹配的报告:“DBGENG: foo.dll has mismatched symbols - type ".hh dbgerr003" for details"
      • 当然它们会被报告为不匹配,因为它们不是在构建DLL时构建的。但只要你使用相同的编译器和设置(你提到的)并且源代码根本没有改变,那么符号应该可以工作。
      • 我想我是在假设除非我有一个匹配我根本无法信任调用堆栈,虽然也许正如你所说的它们永远不会匹配,但也许尽管如此我仍然可以有一个大部分是有效的调用堆栈。
      • 为什么会这样?也就是说,/i 是什么意思?
      • 来自 Windbg 的帮助:“忽略 .pdb 文件版本中的不匹配。”
      【解决方案3】:

      尝试 chkmatch (http://debuginfo.com/tools/chkmatch.html) - 它能够覆盖 pdb 文件中的签名,因此 exe 和 pdb 将匹配。另外,前段时间我写了一篇关于“离线”检查pdb文件的帖子,也许你会发现那里有一些有用的东西:http://lowleveldesign.wordpress.com/2011/12/09/pdb-file-out-of-debugger/

      【讨论】:

      • 这是一个很好的建议,但如果年龄字段不同,chkmatch -m 可能会失败,这似乎很可能在这里。二进制文件的 PDB 签名和年龄可能为 0。如果年龄不匹配,chkmatch 不会更改 GUID,而且 PDB 中的年龄几乎肯定不是 0。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多