Wie kann ich Informationen zur Laufzeit von einer DMP -Datei in einer Windbg -Erweiterung erhalten?

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

Frage

Dies hängt mit meine vorherige Frage, bezüglich des Ziehens von Objekten aus einer DMP -Datei.

Wie ich in der vorherigen Frage erwähnt habe, kann ich Objekte erfolgreich aus der DMP -Datei herausziehen, indem ich Wrapper 'Remote' -Objekte erstelle. Ich habe bisher einige davon implementiert, und es scheint gut zu funktionieren. Ich bin jedoch auf einen Haken gestoßen.

In einem Fall wird ein Zeiger in einer Klasse gespeichert, beispielsweise vom Typ "sonbaseclass", aber dieses Objekt ist tatsächlich von dem Typ "irgendwann eine irgendwanner Klasse", die sich aus "sonbaseclass" ergibt. Zum Beispiel wäre es so etwas:

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

Ich brauche einen Weg, um herauszufinden, was der tatsächliche Typ "Feld" ist.

Um genauer zu sein, verwenden Sie Beispieladressen:

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

Wenn ich in Windbg bin, kann ich Folgendes tun:

dt 0x02de89e4 

Und es wird den Typ zeigen:

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

Aber wie bekomme ich das in eine Erweiterung? Kann ich SearchMemory () verwenden, um nach "SOMEDERIVE CLASSE ::" Vftable "zu suchen? Wenn Sie meiner anderen Frage folgen, benötige ich diese Typinformationen, damit ich weiß, welche Art von Wrapper -Remote -Klassen zu erstellen sind. Ich denke, es könnte eine Art Fallbeamte sein, wo ich eine Zeichenfolge mit einem Typ anpassen muss? Ich bin damit einverstanden, aber ich weiß immer noch nicht, wo ich diese Zeichenfolge bekommen kann, die den Typ des betreffenden Objekts darstellt (dh ein Feld1-Feld1 im obigen Beispiel).

War es hilfreich?

Lösung

Doh! Es war viel einfacher als ich dachte. Die virtuellen Funktionstabellen sind einfach andere Symbole, sodass ich Getymbol () mit der Adresse des Feldes des Feld1 verwenden kann. Richten Sie dann einfach eine Fallanweisung mit den wenigen Typen ein, die ich erwarte, und erstellen Sie das richtige für die Situation.

Zum Beispiel:

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

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

In Windbg, wenn ich die Erweiterung ausführe, gibt dies aus:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

Einfach. Ich muss nur diesen Puffer analysieren und ich sollte gut gehen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top