Come posso ottenere informazioni di tipo in fase di esecuzione da un file DMP in un'estensione WindBG?

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

Domanda

Questo è correlato a la mia domanda precedente, per quanto riguarda la trazione di oggetti da un file DMP.

Come ho già detto nella domanda precedente, posso estrarre correttamente l'oggetto dal file DMP creando oggetti "remoti". Ho implementato molti di questi finora e sembra funzionare bene. Comunque mi sono imbattuto in uno strano.

In un caso, un puntatore viene archiviato in una classe, diciamo del tipo "SomeBaseClass", ma quell'oggetto è in realtà del tipo "SomeDerivedClass" che deriva da "SomeBaseClass". Ad esempio sarebbe qualcosa di simile:

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

Ho bisogno di un modo per scoprire qual è il tipo effettivo di "field1".

Per essere più specifici, utilizzando gli indirizzi di esempio:

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

Quando sono a WindBG, posso farlo:

dt 0x02de89e4 

E mostrerà il tipo:

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

Ma come posso farlo entrare in un'estensione? Posso usare SearchMemory () per cercare 'SomeDerivedClass :: `vFtable'? Se segui la mia altra domanda, ho bisogno di questo tipo di informazioni, quindi so che tipo di classi remote wrapper da creare. Immagino che potrebbe finire per essere una sorta di caso di stato, in cui devo abbinare una stringa a un tipo? Sto bene con quello, ma non so ancora dove posso ottenere quella stringa che rappresenta il tipo di oggetto in questione (cioè qualche object-> field1 nell'esempio sopra).

È stato utile?

Soluzione

Doh! Era molto più semplice di quanto pensassi. Le tabelle delle funzioni virtuali sono semplicemente altri simboli, quindi posso usare GetSymbol () con l'indirizzo del vftable di Field1. Quindi basta impostare una dichiarazione del caso con i pochi tipi che mi aspetto e crei quella giusta per la situazione.

Per esempio:

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

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

In windbg quando eseguo l'estensione, questa uscita:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

Semplice. Devo solo analizzare quel buffer e dovrei essere bravo ad andare ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top