Как пройти нативный объект в 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.
Кроме того, заголовок объекта может быть сброшен. Заголовок объекта всегда находится в 18-часовом байте до объекта в памяти. Его можно сбросить с помощью следующей команды
!dt nt!_object_header address-18h
Чтобы выяснить тип, который вам может понадобиться, в дополнение к дампу типа объекта. Это может быть достигнуто с помощью следующей команды.
!dt nt!_object_type address-of-type
Адрес типа печатается как часть дампа заголовка объекта. Соответствующее имя поля - Тип.
Другие советы
Команда d * должна дать вам содержимое памяти d
модуль dt! typedef addr
например, dt MyModule! MyClass 0x12345678