Debugging 崩溃转储-WinDbg-强制PDB文件与不匹配的文件匹配';不行?

Debugging 崩溃转储-WinDbg-强制PDB文件与不匹配的文件匹配';不行?,debugging,windbg,symbols,crash-dumps,Debugging,Windbg,Symbols,Crash Dumps,我有一个客户应用程序的崩溃转储,它是用我们的dll的一个非常旧的版本(发布版本,没有原始符号)构建的,我一直在WinDbg中分析它 为了获得更多信息,我在发布模式下重建了dll,这次使用了符号,使用了相同的编译器版本,我相信设置与最初构建dll时相同。我将符号文件添加到我的符号路径中,但添加了WinDbg扩展名!itoldyouso告诉我转储中的模块与PDB文件不匹配。启用SYMOPT_LOAD_ANYTHING也无济于事 !!itoldyouso告诉我它们不匹配,因为模块没有pdb sig(值

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

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


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

尝试chkmatch()-它能够覆盖pdb文件中的签名,以便exe和pdb匹配。另外,不久前我写了一篇关于“脱机”检查pdb文件的帖子,也许你会发现其中有一些有用的东西:。

你试过
。重新加载/I foo.dll

对于详细输出,请尝试:


!sym嘈杂;。重新加载/i foo.dll;x福*test*

不幸的是,您没有与DLL匹配的符号:(。据我所知,现在的任何尝试都无法为您获得精确匹配的PDB

回收一些旧线程,这将有助于:

你最好的选择是

a、 将代码同步回DLL发布时的时间

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


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

是的,它加载foo的符号,但在详细输出中我也看到报告的不匹配:“DBGENG:foo.dll具有不匹配的符号-键入“.hh dbgerr003”了解详细信息”当然,它们将被报告为不匹配,因为它们不是在构建DLL时构建的。但只要您使用相同的编译器和设置(如您所述)源代码没有任何变化,那么符号就应该起作用了。我想我是在假设的基础上操作的,除非我有一个匹配项,否则我就是不能信任调用堆栈,虽然可能正如你所说,它们永远不会匹配,但也许尽管如此,我仍然可以拥有一个基本有效的调用堆栈。为什么这样做呢?也就是说,
/I
sIgnitify?来自Windbg的帮助:“忽略.pdb文件版本中的不匹配。”这是一个很好的建议,但是如果年龄字段不同,则
chkmatch-m
可能会失败,这在这里似乎很可能。二进制文件的PDB签名和年龄可能为0。如果年龄不匹配,chkmatch不会更改GUID,PDB中的年龄几乎肯定不是0。