WinDbg中的Dr. Watson转储 - 需要临时区议会/ DLL最初建于安装的版本?(WinD

2019-07-04 00:34发布

I have a mindmp file from a target's application crash. Is it possible for me to rebuild the dll/pdb files for a version of software and have windbg load symbols correctly?

My problem is that our pdb files are only kept for major releases (unfortunately). This is a daily build, which I can rebuild myself, but I'm getting tripped up on errors.

With !sym noisy on: "image header does not match memory image header."

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

Note I've build the pdb with the dll, they are from the same RELEASE directory (should I be building debug?)

Theses are release builds (as release builds are installed on the target and crashing) should I be somehow using the debug build dlls to get more symbol information?

Answer 1:

根据我的经验可能不是。

如果你有确切的构建目录,并具有完全相同的编译器设置建那么这可能会奏效。 你肯定将无法从反对释放崩溃转储调试版本加载符号。

您需要打开“负载什么”选项:.symopt + 0×40得到的WinDbg忽略时间戳差异。



Answer 2:

该ChkMatch工具是专为这个确切的情况。 只要你有原始的.EXE,你可以重新编译源(相同的编译器和编译器设置)和修补新.PDB相匹配的旧.EXE。

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

chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb

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



Answer 3:

如果你仍然有确切的源代码中的图像是由编译,然后重建它产生一个新的PDB文件,然后指示WinDbg中,当您打开崩溃转储强行加载这个PDB - 它在我的实践中摸索一次。



Answer 4:

PDB文件由一个GUID和“年龄”(这是一个序列号),绑在自己的EXE文件。 这些被嵌入的EXE,进入PDB。 GUID是再生每个完整的构建,而“年龄”在每个增量生成改变。

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

我不知道有关SteveMan提到的“chkmatch”的工具,但我怀疑它的工作原理是修修补补的GUID /年龄,使它们匹配。



Answer 5:

这是为时已晚,以帮助道格,但对任何人的缘故谁碰到这个问题来了,另一个线程( 是否有可能在Visual Studio中加载的不匹配符号? )指出一种方式来获得的WinDbg接受不匹配的.PDB文件

.symopt_0x40


文章来源: WinDbg Dr. Watson minidump - requires pdb/dll originally built for installed version?