Como andar um objeto nativo no Windbg?
Pergunta
Estou investigando o que está ocupando muita memória no meu aplicativo. Usando o comando! Dumpobj, posso contornar os objetos gerenciados. Mas como faço o equivalente a objetos nativos? Por exemplo, este objeto .NET tem um ponteiro para o código nativo. Estou preso aqui ... como faço o equivalente a! Dumpobj daqui? Eu tenho toda a fonte e 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
Solução
Você pode despejar o objeto executando o seguinte comando:
!object address.
Além disso, o cabeçalho do objeto pode ser despejado. O cabeçalho do objeto está sempre localizado em bytes 18h antes do objeto na memória. Pode ser despejado com o seguinte comando
!dt nt!_object_header address-18h
Para descobrir o tipo que você pode querer, além de despejar o tipo de objeto. Isso pode ser alcançado com o seguinte comando.
!dt nt!_object_type address-of-type
O endereço do tipo é impresso como parte do despejo do cabeçalho do objeto. O nome do campo correspondente é tipo.
Outras dicas
O comando d* deve lhe dar conteúdo da memóriad
módulo dt! typedef addr
por exemplo, dt mymodule! myclass 0x12345678