Comment faire marcher un objet natif dans WinDbg?
Question
J'examine ce qui occupe beaucoup de mémoire dans mon application. En utilisant la commande! DumpObj, je peux contourner les objets gérés. Mais comment puis-je faire l'équivalent pour les objets natifs? Par exemple, cet objet .NET a un pointeur sur le code natif. Je suis coincé ici ... comment faire l'équivalent de! DumpObj à partir d'ici? J'ai toute la source et les symboles.
0:006> !DumpObj 0000000006222a50
Name: Beriliun.GS.Internal.Signer
MethodTable: 000007ff00658548
EEClass: 000007ff00734170
Size: 24(0x18) bytes
(d:\GS\bin\debug\LIBXT.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef02f8448 4000647 8 PTR 0 instance 000000002d7621e0 pSigner
0:006> !DumpObj 000000002d7621e0
<Note: this object has an invalid CLASS field>
Invalid object
La solution
Vous pouvez vider l'objet en exécutant la commande suivante:
!object address.
De plus, l'en-tête de l'objet peut être vidé. L'en-tête d'objet est toujours situé à 18h octets avant l'objet en mémoire. Il peut être vidé avec la commande suivante
!dt nt!_object_header address-18h
Pour déterminer le type que vous souhaitez peut-être en plus de vider le type d'objet. Ceci peut être réalisé avec la commande suivante.
!dt nt!_object_type address-of-type
L'adresse du type est imprimée dans le cadre du vidage de l'en-tête de l'objet. Le nom de champ correspondant est Type.
Autres conseils
La commande d * devrait vous donner le contenu de la mémoire d
module dt! typedef addr
Par exemple, dt MyModule! MyClass 0x12345678