¿Cómo caminar un objeto nativo en WinDbg?
Pregunta
Estoy investigando qué ocupa mucha memoria en mi aplicación. Usando el comando! DumpObj, puedo evitar los objetos administrados. Pero, ¿cómo hago el equivalente para los objetos nativos? Por ejemplo, este objeto .NET tiene un puntero al código nativo. Estoy atrapado aquí ... ¿cómo hago el equivalente de! DumpObj desde aquí? Tengo toda la fuente y los símbolos.
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
Solución
Puede volcar el objeto ejecutando el siguiente comando:
!object address.
Además, también se puede volcar el encabezado del objeto. El encabezado del objeto siempre se encuentra a 18 h bytes antes del objeto en la memoria. Se puede volcar con el siguiente comando
!dt nt!_object_header address-18h
Para averiguar el tipo que puede desear además de volcar también el tipo de objeto. Esto se puede lograr con el siguiente comando.
!dt nt!_object_type address-of-type
La dirección del tipo se imprime como parte del volcado del encabezado del objeto. El nombre del campo correspondiente es Tipo.
Otros consejos
El comando d * debería darle contenido de la memoria d
módulo dt! typedef addr
por ejemplo, dt MyModule! MyClass 0x12345678