我有一个Windows minidump(C代码)和一个相应的exe文件。不幸的是,我没有完全匹配的.pdb文件,但我确实有.pdbs包含完全相同的代码,只是在不同的时间构建。在Windbg中,我可以使用:
.symopt+0x40
告诉它加载任何东西,甚至是不匹配的符号文件。这在这个特定的实例中效果很好,我能够得到一个正确的调用堆栈。我只是好奇Visual Studio是否有这样的功能。我们在这里使用了几乎所有不同版本的VS,因此它可能属于哪个版本并不重要。谢谢。
答案 0 :(得分:19)
尝试this utility:
ChkMatch实用程序可用于检查可执行文件和调试信息文件是否匹配。它还可用于强制执行可执行文件和调试信息文件之间的匹配(如果它们兼容)。
有关调试信息匹配及相关问题的详细信息,请参阅此article。
支持的调试信息格式:DBG,PDB 2.0,PDB 7.0 ......
答案 1 :(得分:4)
没有覆盖,但是this question的海报找到了修改PDB文件以使它们与EXE匹配的方法。
感谢其中一条评论 第一个答案,我查了一个链接 这本书的pdf“未记载 Windows 2000的秘密:程序员 食谱“。作者进入 有关pdb文件的详细信息 格式。正如我之前所说,我曾经 已经将pdb加载到十六进制中 编辑并翻了一下 看来我做了 年龄/签名匹配,但它没有 工作。好吧,使用该实用程序后 从W2k秘密书到“爆炸” 将pdb放入包含的流中,我 发现他们隐藏了另一个 参考流中的年龄 3 !!!!!!!一旦我将那个翻转为 好吧,它在windbg中匹配。
不确定你是否想要解决这个问题,但看起来它可以完成。如果这是用于生产支持,那么它可能值得您光顾。
答案 2 :(得分:3)
Visual Studio和Windbg通过将Executable标头中的时间戳与pdb文件中存储的时间戳进行比较来匹配pdbs。您可以通过运行dumpin / headers来查看时间戳。
我没有使用过chkmatch但是修改exe或pdb以便相互匹配应该可以正常工作。
请注意,此技术可能不足以调试二进制文件。 John Robbins在他的书“调试Windows”(我可以推荐)中提到他看到了几乎相同时间构建的相同源代码树的不同构建结果。
始终使用您的构建(包括发布版本)构建pdb符号,并将它们与构建产品一起存档,并包含.map文件以便进行测量。
答案 3 :(得分:0)
根据this post,可以在visual studio中使用sos windbg命令。但我不确定“.symopt”是否属于这一类。
答案 4 :(得分:0)
有人告诉我,在VS2019(16.7 .. 16.8棒球场)中,他们切换到了多线程PDB文件生成器以加快速度。
副作用是,在不同线程上生成的文件部分可能在文件中以不同顺序结束。
最重要的是,使用由EXE而非其他组件构建的PDB甚至比以前更重要。