WinDbg Dr. Watson minidump – 需要最初为安装的版本生成的pdb / dll?

我有一个目标的应用程序崩溃mindmp文件。 我有可能重build一个版本的软件的dll / pdb文件,并正确windbg加载符号?

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

使用!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目录(我应该构builddebugging吗?)

这些是发布版本(因为发布版本安装在目标和崩溃)我应该以某种方式使用debugging版本DLL获取更多的符号信息?

在我的经验可能不是。

如果你有确切的编译目录,并使用完全相同的编译器设置来编译,那么这可能工作。 您肯定无法从调试版本中加载符号来对付发布故障转储。

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

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

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

 chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb 

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

如果你仍然有确切的源代码的图像编译,然后重新生成一个新的pdb文件,然后指示WinDbg强行加载这个pdb,当你打开崩溃转储 – 它在我的实践中曾经工作过一次。

PDB文件通过一个GUID和一个“年龄”(这是一个序列号)绑定到他们的EXE文件。 这些嵌入在EXE中,并嵌入到PDB中。 GUID在每个完整构建中都会重新生成,并且每个增量构建都会更改“年龄”。

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

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

这对于帮助Doug来说已经太晚了,但是为了所有遇到这个问题的人,另一个线程( 是否可能在Visual Studio中加载不匹配的符号? )指出了一种让WinDbg接受不匹配的.PDB文件的方法

 .symopt_0x40