1

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

3 回答 3

2

d* 命令应该给你内存 d的内容

于 2009-10-28T19:52:11.653 回答
2

dt 模块!typedef 地址

例如,dt MyModule!MyClass 0x12345678

于 2009-10-28T20:12:03.937 回答
2

您可以通过运行以下命令转储对象:

!object address.

此外,还可以转储对象标头。对象标头始终位于内存中对象之前的 18h 字节处。可以使用以下命令转储

!dt nt!_object_header address-18h

除了转储对象类型之外,还要找出您可能想要的类型。这可以通过以下命令来实现。

!dt nt!_object_type address-of-type

类型的地址作为对象标头转储的一部分打印。对应的字段名称是类型。

于 2009-10-28T20:44:45.577 回答