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

问题描述

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

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

但是我已经得到了一些较早版本的PDB文件,我想查看相同的结构来比较更改,但是由于它们与当前exe不匹配,所以我无法加载较旧的PDB。版本。

所以我的问题是在WinDBG中有没有使用dt命令而不先加载/附加到exe吗?我已经看过DIA SDK,但是对于我所需要的复杂性而言,这似乎让我头疼。

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

解决方法

使用.symopt+ SYMOPT_LOAD_ANYTHING

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

结构识别所需的类型信息不会发挥很大作用。

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

您可以使用!chksym
检查带有pdb的模块。 如果不匹配并且您不在乎源代码行之类的东西,而只需要typeinfo
您可以使用.symopt + 0x40加载不匹配的pdb,并将不匹配的pdb存储在pdbsearchpath(缓存/ 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