Как я могу получить информацию о типе во время выполнения из файла DMP с расширением Windbg? - PullRequest
1 голос
/ 07 апреля 2010

Это связано с моим предыдущим вопросом , касающимся извлечения объектов из файла dmp.

Как я упоминал в предыдущем вопросе, я могу успешно извлечь объект из файла dmp, создав «удаленные» объекты-оболочки. Я реализовал некоторые из них до сих пор, и, кажется, это работает хорошо. Однако я столкнулся с загадкой.

В одном случае указатель хранится в классе, скажем, типа «SomeBaseClass», но на самом деле этот объект имеет тип «SomeDerivedClass», производный от «SomeBaseClass». Например, это будет что-то вроде этого:

MyApplication!SomeObject
   +0x000 field1            : Ptr32 SomeBaseClass
   +0x004 field2            : Ptr32 SomeOtherClass
   +0x008 field3            : Ptr32 SomeOtherClass

Мне нужен какой-то способ узнать, что такое ФАКТИЧЕСКИЙ тип 'field1'.

Чтобы быть более конкретным, используя примеры адресов:

MyApplication!SomeObject
   +0x000 field1            : 0cae2e24 SomeBaseClass
   +0x004 field2            : 0x262c8d3c SomeOtherClass
   +0x008 field3            : 0x262c8d3c SomeOtherClass

0:000> dt SomeBaseClass 0cae2e24 
MyApplication!SomeBaseClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1         : (null) 
   +0x03c basefield2        : 3

0:000> dt SomeDerivedClass 0cae2e24 
MyApplication!SomeDerivedClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1        : (null) 
   +0x03c basefield2        : 3
   +0x040 derivedfield1     : 357
   +0x044 derivedfield2     : timecode_t

Когда я нахожусь в WinDbg, я могу сделать это:

dt 0x02de89e4 

И это покажет тип:

0:000> dt 0x02de89e4 
SomeDerivedClass::`vftable'
Symbol  not found.

Но как мне получить это внутри расширения? Могу ли я использовать SearchMemory () для поиска SomeDerivedClass :: `vftable '? Если вы следите за моим другим вопросом, мне нужна информация о типах, чтобы я знал, какой тип удаленных классов-оболочек создать. Я полагаю, что это может в конечном итоге быть своего рода оператором case, где я должен сопоставить строку с типом? Я в порядке с этим, но я все еще не знаю, где я могу получить эту строку, которая представляет тип рассматриваемого объекта (например, SomeObject-> field1 в приведенном выше примере).

1 Ответ

1 голос
/ 07 апреля 2010

DOH! Это было намного проще, чем я думал. Таблицы виртуальных функций - это просто другие символы, поэтому я могу использовать GetSymbol () с адресом vftable поля field1. Затем просто установите оператор case с несколькими ожидаемыми типами и создайте подходящий для ситуации.

Например:

char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);

dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);

В WinDbg, когда я запускаю расширение, это выводит:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

Simple. Просто надо разобрать этот буфер, и мне пора идти ...

...