3

我有一个来自目标应用程序崩溃的 mindmp 文件。我是否可以为某个软件版本重建 dll/pdb 文件并正确加载 windbg 符号?

我的问题是我们的 pdb 文件只保留在主要版本中(不幸的是)。这是一个每日构建,我可以自己重建,但我被错误绊倒了。

使用 !sym 嘈杂:“图像标题与内存图像标题不匹配。”

DBGENG:  C:\...\XXX.dll image header does not match memory image header.
DBGENG:  XXX.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: C:\...\XXX.pdb - mismatched pdb

注意我已经用 dll 构建了 pdb,它们来自同一个 RELEASE 目录(我应该构建调试吗?)

这些是发布版本(因为发布版本安装在目标上并崩溃)我是否应该以某种方式使用调试构建 dll 来获取更多符号信息?

4

5 回答 5

11

ChkMatch实用程序专为这种确切情况而设计。只要您拥有原始 .EXE,就可以重新编译源代码(使用相同的编译器和编译器设置)并修补新的 .PDB 以匹配旧的 .EXE。

在此示例中,OriginalExecutable.exe是不再具有 .PDB 文件的可执行文件,而RebuiltPDB.pdb是通过重建原始源生成的可执行文件。

chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb

现在,只要这两个文件有它们的原始名称,调试器就应该接受它们作为匹配对。

于 2008-10-02T03:47:42.300 回答
8

以我的经验可能不会。

如果您有确切的构建目录并使用完全相同的编译器设置进行构建,那么这可能会起作用。您肯定无法从调试版本中针对发布崩溃转储加载符号。

您将需要打开“加载任何内容”选项:.symopt+0x40 以让 windbg 忽略时间戳差异。

于 2008-09-25T18:05:06.943 回答
2

如果您仍然拥有编译映像的确切源代码,则重建它以生成一个新的 pdb 文件,然后指示 WinDbg 在您打开故障转储时强制加载此 pdb - 它在我的实践中工作过一次。

于 2008-10-24T12:31:25.903 回答
1

PDB 文件通过 GUID 和“年龄”(它是一个序列号)与它们的 EXE 文件相关联。这些嵌入在 EXE 和 PDB 中。GUID 在每次完整构建时重新生成,并且“年龄”在每次增量构建时更改。

调试器使用这些来确保它正在查看 EXE 文件的正确 PDB。

我不知道 SteveMan 提到的“chkmatch”工具,但我怀疑它可以通过修补 GUID/age 以使其匹配来工作。

于 2008-10-14T16:10:24.153 回答
0

帮助 Doug 为时已晚,但为了遇到这个问题的任何人,另一个线程(是否可以在 Visual Studio 中加载不匹配的符号?)指出了一种让 WinDbg 接受不匹配的 .PDB 文件的方法

.symopt_0x40
于 2014-01-13T19:32:21.960 回答