代码之家  ›  专栏  ›  技术社区  ›  Doug T.

windbg dr.watson minidump-需要最初为安装版本构建的pdb/dll吗?

  •  3
  • Doug T.  · 技术社区  · 17 年前

    我有一个来自目标应用程序崩溃的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,它们来自同一个发布目录(我应该构建调试吗?)

    这些是发布版本(当发布版本安装在目标上并崩溃时),我应该以某种方式使用调试版本DLL获取更多符号信息吗?

    5 回复  |  直到 11 年前
        1
  •  8
  •   Rob Walker    17 年前

    根据我的经验,可能不会。

    如果您有确切的生成目录并使用 完全相同 编译器设置,这样就可以了。您肯定不能从调试构建中加载符号来对抗发布崩溃转储。

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

        2
  •  11
  •   SteveMan    17 年前

    这个 ChkMatch 实用程序是为这个精确的场景而设计的。 只要有原始的.exe文件,就可以重新编译源文件(使用相同的编译器和编译器设置),并修补新的.pdb以匹配旧的.exe文件。

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

    chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb
    

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

        3
  •  2
  •   mikhailitsky    16 年前

    如果您仍然拥有编译图像所用的确切源代码,则重新生成它,生成一个新的PDB文件,然后指示windbg在打开崩溃转储时强制加载此PDB—在我的实践中,它曾经工作过一次。

        4
  •  1
  •   Roger Lipscombe    17 年前

    pdb文件通过一个guid和一个“age”(序列号)绑定到它们的exe文件。它们嵌入到exe和pdb中。在每个完整构建上重新生成guid,并在每个增量构建上更改“年龄”。

    调试器使用这些来确保它正在为exe文件查找正确的pdb。

    我不知道史蒂文曼提到的“chkmatch”工具,但我怀疑它是通过修补guid/age使它们匹配来工作的。

        5
  •  0
  •   Community CDub    8 年前

    这对道格来说太晚了,但为了任何遇到这个问题的人,另一条线索( Is it possible to load mismatched symbols in Visual Studio? )指出了一种让windbg接受不匹配的.pdb文件的方法

    .symopt_0x40