故障转储 - 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 文件匹配不起作用?的主要内容,如果未能解决你的问题,请参考以下文章