在Visual Studio中是否可能加载不匹配的符号?

18

我有一个 Windows minidump(C 代码)和相应的 exe 文件。不幸的是,我没有完全匹配的 .pdb 文件,但我有包含完全相同代码的 .pdbs,只是在不同时间构建而成。在 Windbg 中,我可以使用:

.symopt+0x40

即使是不匹配的符号文件,也要告诉它加载任何东西。在这种特定情况下,这很有效,我能够获得正确的调用堆栈。 我只是想知道Visual Studio是否有这样的功能。我们在这里使用几乎所有不同版本的VS,因此无论可能在哪个版本中都无所谓。谢谢。


这并不是真正回答你的问题,但如果你在一致的开发工具集上标准化,你会给自己带来很大的好处。 - 3Dave
1
我们有一个一致的集合。只是我们支持旧版本的软件,而将旧版本的软件移植到较新版本的Visual Studio中并不值得冒险。 - Morinar
5个回答

22

请尝试使用此工具

ChkMatch实用程序可用于检查可执行文件和调试信息文件是否匹配。如果它们兼容,还可以用于强制执行可执行文件和调试信息文件之间的匹配。

有关调试信息匹配和相关问题的更多信息,请参见此文章

支持的调试信息格式:DBG,PDB 2.0,PDB 7.0...


整个命令看起来像是 chkmatch -m C:\Temp\myLib.dll C:\Temp\myLib.pdb。 - honzajscz
1
这个答案中的所有链接都已失效。 - Guillaume Gris
您可以在此处找到该实用工具:https://web.archive.org/web/20210205095232/https://www.debuginfo.com/tools/chkmatch.html - Vardit

5

虽然没有覆盖方式,但是回答这个问题的帖子中提到了一种修改PDB文件以使其与EXE匹配的方法。

在第一个答案的评论区里,有人提供了一本名为《Windows 2000秘籍:程序员的烹饪书》的PDF书籍链接。作者详细讲解了PDB文件格式。就像我之前说过的,我已经将PDB文件加载到十六进制编辑器中,并翻转了一些比特,看起来好像把年龄/签名匹配了,但是不起作用。在使用W2k秘籍书中的工具“爆炸”PDB成包含在其中的流之后,我发现它们在流3中隐藏了另一个对于年龄的引用!!!翻转那个数字之后,它在windbg中得到了匹配。

不确定您是否想花这么多功夫,但看起来是可行的。如果这是为了生产支持而做的话,那么值得您去尝试。


我最终解决了这个问题,但是想要接受一个答案,因为我不希望我的回答率低于100% ;-) 这个答案似乎提供了最有用的信息,所以我接受它。 - Morinar

3
Visual Studio和Windbg通过比较可执行文件头中的时间戳与存储在pdb文件中的时间戳来匹配pdb。您可以通过运行dumpin /headers来查看时间戳。
我没有使用过chkmatch,但修改exe或pdb以使它们相匹配应该可以正常工作。
请注意,这种技术可能不足以调试您的二进制文件。约翰·罗宾斯在他的书《Windows调试》中提到,他曾看到从几乎相同的源代码树构建的不同构建结果。
始终将pdb符号与构建一起生成(包括发布构建),并将它们存档在构建产品旁边,并出于谨慎起见,包括.map文件。

0
根据这篇文章,在Visual Studio中也可以使用SOS Windbg命令。但我不确定“.symopt”是否也属于此类别。

0

我听说在VS2019(16.7..16.8左右)中,他们切换到了多线程PDB文件生成器以加快速度。

一个副作用是,由不同线程生成的文件部分可能以不同的顺序出现在文件中。

总之,比以往任何时候都更重要的是,您使用与EXE一起构建的PDB而不是其他任何PDB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接