我正在调查我的应用中占用大量内存的内容。使用!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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top