我有一个目标的应用程序崩溃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