WinDbg Dr. Watson minidump-是否要求pdb / dll最初是为已安装的版本构建的?

时间:2020-03-06 14:44:15  来源:igfitidea点击:

我有一个来自目标应用程序崩溃的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来获取更多符号信息?

解决方案

以我的经验,可能不是。

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

我们将需要打开"加载任何内容"选项:.symopt + 0x40,以使windbg忽略时间戳差异。

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

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

chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb

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

PDB文件通过GUID和"年龄"(它是序列号)与它们的EXE文件绑定在一起。这些都嵌入在EXE和PDB中。 GUID在每个完整版本上都重新生成,并且" age"在每个增量版本上都更改。

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

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

如果我们仍然具有从中编译映像的确切源代码,请对其进行重建以生成一个新的pdb文件,然后在打开故障转储时指示WinDbg强制加载该pdb,这在我的实践中已经起作用了。