Come camminare un oggetto nativo in WinDbg?
Domanda
Sto studiando cosa sta occupando molta memoria nella mia app. Usando il comando! DumpObj, posso aggirare gli oggetti gestiti. Ma come posso fare l'equivalente per gli oggetti nativi? Ad esempio, questo oggetto .NET ha un puntatore al codice nativo. Sono bloccato qui ... come faccio a fare l'equivalente di! DumpObj da qui? Ho tutta la fonte e i simboli.
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
Soluzione
Puoi scaricare l'oggetto eseguendo il comando seguente:
!object address.
Inoltre è possibile scaricare anche l'intestazione dell'oggetto. L'intestazione dell'oggetto si trova sempre a 18h byte prima dell'oggetto in memoria. Può essere scaricato con il seguente comando
!dt nt!_object_header address-18h
Per capire il tipo che potresti desiderare oltre a scaricare anche il tipo di oggetto. Ciò può essere ottenuto con il seguente comando.
!dt nt!_object_type address-of-type
L'indirizzo del tipo viene stampato come parte del dump dell'intestazione dell'oggetto. Il nome del campo corrispondente è Tipo.
Altri suggerimenti
Il comando d * dovrebbe fornire il contenuto della memoria d
modulo dt! typedef addr
ad es. dt MyModule! MyClass 0x12345678