问题描述
我一直在使用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