WinDbg Dr. Watson minidump-是否要求pdb / dll最初是为已安装的版本构建的?
我有一个来自目标应用程序崩溃的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,这在我的实践中已经起作用了。