故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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。

以上是关于故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

WinDbg单机调试

如何读取故障转储文件(我有源代码和 .pdb 文件)

强制 WinDbg 加载已卸载模块的符号

无法读取 windbg 中的故障转储

WinDbg x64:无法调试故障转储 - 无法加载数据访问 DLL

我用VC编写了一个exe,但是生成的pdb怎么也无法用于windbg调试