Comment puis-je obtenir des informations de type à l'exécution d'un fichier DMP dans une extension Windbg?

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

Question

Ceci est lié à ma précédente question , en ce qui concerne tirer des objets à partir d'un fichier dmp.

Comme je l'ai mentionné dans la question précédente, je peux tirer avec succès l'objet à partir du fichier dmp en créant des objets « à distance » wrapper. Je l'ai mis en œuvre plusieurs de ces jusqu'à présent, et il semble bien fonctionner. Cependant, j'ai rencontré un accroc.

Dans un cas, un pointeur est stocké dans une classe, disons de type « SomeBaseClass », mais cet objet est en fait du type « SomeDerivedClass » qui dérive de « SomeBaseClass ». Par exemple, il serait quelque chose comme ceci:

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

Je besoin d'un moyen de savoir ce que le type RÉEL de « field1 » est.

Pour être plus précis, en utilisant des adresses exemple:

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

Quand je suis WinDbg, je peux faire ceci:

dt 0x02de89e4 

Et il affiche le type:

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

Mais comment puis-je obtenir qu'à l'intérieur d'une extension? Puis-je utiliser SearchMemory () pour chercher 'SomeDerivedClass :: `vftable'? Si vous suivez mon autre question, j'ai besoin ces informations de type donc je sais ce type de wrapper des classes à distance pour créer. Je me dis que cela pourrait finir par être une sorte de cas déclaration, où je dois correspondre une chaîne à un type? Je suis ok avec ça, mais je ne sais toujours pas où je peux obtenir cette chaîne qui représente le type de l'objet en question (à savoir SomeObject-> field1 dans l'exemple ci-dessus).

Était-ce utile?

La solution

DOH! Il était beaucoup plus simple que ce que je pensais. Les tables de fonctions virtuelles sont simplement d'autres symboles, je peux donc utiliser getSymbol () avec l'adresse du vftable du field1. Ensuite, il suffit de configurer une déclaration de cas avec les quelques types je pense, et créer la bonne pour la situation.

Par exemple:

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

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

Dans WinDbg quand je lance l'extension de cette sortie:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'
Simple

. Suffit d'analyser ce tampon et je devrais être bon d'aller ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top