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
Était-ce utile?

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

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