Как я могу получить информацию о том, чтобы получить информацию во время выполнения от файла DMP в расширении WINDBG?

StackOverflow https://stackoverflow.com/questions/2588431

Вопрос

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

Как я уже упоминал в предыдущем вопросе, я могу успешно вытянуть объект из файла DMP, создавая Wrapper 'Remote' объекты. Я внедрил несколько из них до сих пор, и, похоже, хорошо работает. Однако я столкнулся с зацеплением.

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

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 () для поиска «ComeederiveClass ::` VFFable »? Если вы следуете за моим другом вопросом, мне нужен эта информация о типе, поэтому я знаю, какой тип удаленных классов обертки для создания. Я полагаю, что это может в конечном итоге быть каким-то вариантом, где я должен соответствовать строке к типу? Я в порядке с этим, но я до сих пор не знаю, где я могу получить эту строку, которая представляет тип рассматриваемого объекта (т. Е. Некоторые -> поле 1 в приведенном выше примере).

Это было полезно?

Решение

Дох! Это было намного проще, чем я думал. В таблицах виртуальных функций - это просто другие символы, поэтому я могу использовать getsymbol () с адресом VFFable Field1. Затем просто настройте оператор регистра с несколькими типами, которые я ожидаю, и создать правильный для ситуации.

Например:

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

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

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

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

Простой. Просто нужно разбирать этот буфер, и мне должно быть хорошо, чтобы пойти ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top