在没有 exe 的情况下读取 WinDBG 中的符号

Read symbols in WinDBG without exe

我一直在使用 WinDBG 查看附加的 C++ exe 的一些结构,例如

dt blah::class::thingy
    +0x000 Flags: Uint4B
    +0x004 Whatever : Ptr64 something

但是我得到了一些早期版本的旧 PDB 文件,我想查看相同的结构以比较更改,但我无法加载旧的 PDB,因为它们与当前 exe 版本。

所以我的问题是无论如何都可以在 WinDBG 中使用 dt 命令而不先 loading/attaching 到 exe?我看过 DIA SDK,但就我需要的复杂性而言,它似乎超出了我的理解范围。

我不确定是否可以在不先加载 exe 的情况下加载 PDB?

使用.symopt+ SYMOPT_LOAD_ANYTHING

将不匹配的 pdb 加载到当前 exe 但请注意并谨慎使用

结构识别所需的类型信息不会有太大影响。

但函数的源行号或反汇编地址可能不匹配 并提供虚假信息

您可以使用 !chksym
使用 pdb 检查模块 如果它不匹配并且你不关心源代码行和类似的东西但只需要 typeinfo
您可以使用 .symopt+ 0x40 加载不匹配的 pdb 并将不匹配的 pdb 存储在 pdbsearchpath (cache/curdir/sympath/etc)

0:000> !chksym loadany.exe loadany.pdb

loadany.exe
    Timestamp: 5F89E8D1
  SizeOfImage: 4E000
          pdb: C:\Users\XX\Desktop\loadany\loadany.pdb
      pdb sig: 2FDF9552-88E3-4452-9B5D-A03B24165869
          age: 1

loadany.pdb
      pdb sig: CB93F230-0E80-4485-AA6F-42202F1CF233
          age: 1

sig MISMATCH: loadany.pdb and loadany.exe

0:000> !sym noisy
noisy mode - symbol prompts off
0:000> .reload /f loadany.exe
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DBGHELP: C:\Users\XX\Desktop\loadany\loadany.pdb - mismatched pdb
DBGHELP: Couldn't load mismatched pdb C:\Users\XX\Desktop\loadany\loadany.exe
DBGHELP: loadany - no symbols loaded

0:000> .symopt +0x40
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Symbol options are 0x800B0367:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
0:000> .reload /f loadany.exe
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DBGHELP: C:\Users\XX\Desktop\loadany\loadany.pdb - mismatched pdb
DBGHELP: Loaded mismatched pdb for C:\Users\XX\Desktop\loadany\loadany.exe
DBGHELP: loadany - private symbols & lines
        C:\Users\XX\Desktop\loadany\loadany.pdb - unmatched