Вопрос

Я исследую, что занимает много памяти в моем приложении. С помощью команды! 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.

Кроме того, заголовок объекта может быть сброшен. Заголовок объекта всегда находится в 18-часовом байте до объекта в памяти. Его можно сбросить с помощью следующей команды

!dt nt!_object_header address-18h

Чтобы выяснить тип, который вам может понадобиться, в дополнение к дампу типа объекта. Это может быть достигнуто с помощью следующей команды.

!dt nt!_object_type address-of-type

Адрес типа печатается как часть дампа заголовка объекта. Соответствующее имя поля - Тип.

Другие советы

Команда d * должна дать вам содержимое памяти d

модуль dt! typedef addr

например, dt MyModule! MyClass 0x12345678

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top