如何在WinDbg中遍历本机对象?
题
我正在调查我的应用中占用大量内存的内容。使用!DumpObj命令,我可以绕过托管对象。但是如何为原生对象做等效的操作呢?例如,此.NET对象具有指向本机代码的指针。我被困在这里...我怎么做相当于!DumpObj从这里?我有所有的来源和符号。
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
解决方案
您可以通过运行以下命令来转储对象:
!object address.
此外,还可以转储对象标头。对象头始终位于内存中对象之前的18h字节处。可以使用以下命令转储它
!dt nt!_object_header address-18h
除了转储对象类型外,还要找出您可能想要的类型。这可以通过以下命令实现。
!dt nt!_object_type address-of-type
类型的地址作为对象标题转储的一部分打印。相应的字段名称为Type。
其他提示
d *命令应该为您提供内存的内容 d
dt module!typedef addr
例如,dt MyModule!MyClass 0x12345678
不隶属于 StackOverflow