我有一个 Windows minidump(C 代码)和一个相应的 exe 文件。不幸的是,我没有完全匹配的 .pdb 文件,但我确实有 .pdbs 包含刚刚在不同时间构建的完全相同的代码。在 Windbg 中,我可以使用:
.symopt+0x40
告诉它加载任何东西,甚至是不匹配的符号文件。这在这种特定情况下效果很好,并且我能够获得正确的调用堆栈。我只是好奇 Visual Studio 是否有这样的功能。我们在这里使用几乎所有不同版本的 VS,所以它可能在哪个版本中并不重要。谢谢。
我有一个 Windows minidump(C 代码)和一个相应的 exe 文件。不幸的是,我没有完全匹配的 .pdb 文件,但我确实有 .pdbs 包含刚刚在不同时间构建的完全相同的代码。在 Windbg 中,我可以使用:
.symopt+0x40
告诉它加载任何东西,甚至是不匹配的符号文件。这在这种特定情况下效果很好,并且我能够获得正确的调用堆栈。我只是好奇 Visual Studio 是否有这样的功能。我们在这里使用几乎所有不同版本的 VS,所以它可能在哪个版本中并不重要。谢谢。
没有覆盖,但是这个问题的发布者找到了一种修改 PDB 文件以使其与 EXE 匹配的方法。
感谢对第一个答案的评论之一,我查看了“未记录的 Windows 2000 秘密:程序员食谱”一书的 pdf 链接。作者详细介绍了 pdb 文件格式。正如我之前所说,我已经将 pdb 加载到十六进制编辑器中并翻转了一些位,似乎我进行了年龄/签名匹配,但它不起作用。好吧,在使用 W2k 机密书中的实用程序将 pdb“爆炸”到包含的流中之后,我发现它们在流 3 中隐藏了另一个对年龄的引用!!!!!!!!!一旦我也翻转了那个,它就在windbg中匹配了。
不知道你是否想这么麻烦,但看起来可以做到。如果这是为了生产支持,那么值得您花时间。
Visual Studio 和 Windbg 通过将 Executable 标头中的时间戳与存储在 pdb 文件中的时间戳进行比较来匹配 pdb。您可以通过运行 dumpin /headers 查看时间戳。
我没有使用 chkmatch 但修改 exe 或 pdb 以相互匹配应该可以正常工作。
请注意,这种技术可能不足以调试您的二进制文件。John Robbins 在他的书“调试 Windows”(我可以推荐)中提到,他从几乎相同的时间构建的相同源代码树中看到了不同的构建结果。
始终使用您的构建(包括发布构建)构建 pdb 符号,并将它们与构建产品一起存档,并包含 .map 文件以进行良好的测量。
根据这篇文章,它也可以在 Visual Studio 中使用 sos windbg 命令。但我不确定“.symopt”是否也属于这一类。
有人告诉我,在 VS2019(16.7 .. 16.8 球场)中,他们切换到了多线程 PDB 文件生成器以加快速度。
副作用是在不同线程上生成的文件部分可能以不同的顺序在文件中结束。
最重要的是,使用由 EXE 构建的 PDB 比以前更重要,而不是其他。