Поделиться через


dt (тип отображения)

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

Синтаксис пользовательского режима

dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List] 
dt [-DisplayOpts] Address [-l List] 
dt -h 

Синтаксис режима ядра

[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List] 
dt [-DisplayOpts] Address [-l List] 
dt -h 

Параметры

Процессор
Указывает процессор, выполняющий процесс, содержащий необходимые сведения. Дополнительные сведения см. в разделе "Многопроцессорный синтаксис". Процессоры могут быть указаны только в режиме ядра.

DisplayOpts
Указывает один или несколько параметров, указанных в следующей таблице. Перед этими параметрами предшествует дефис.

Вариант Описание

-a[количество]

Отображение каждого элемента массива в новой строке с его индексом. Будет отображаться общее количество элементов. Между количеством и количеством не должно быть места. Если значение -a не следует за цифрой, отображаются все элементы в массиве. Переключатель -a[quantity] должен отображаться непосредственно перед каждым именем типа или именем поля, отображаемым таким образом.

-b

Отображение блоков рекурсивно. Если отображаемая структура содержит подструктуры, она развертывается рекурсивно на произвольные глубины и отображается в полном объеме. Указатели развертываются только в том случае, если они находятся в исходной структуре, а не в подструктурах.

-c

Компактные выходные данные. Все поля отображаются в одной строке, если это возможно. (При использовании с параметром -a каждый элемент массива принимает одну строку, а не форматируется как блок с несколькими строками.)

-d

При использовании с именем , заканчивающимся звездочкой, выводятся подробные выходные данные для всех типов, начинающихся с name. Если имя не заканчивается звездочкой, отображает подробные выходные данные.

-e

Принудительно перечисляет типы dt . Этот параметр необходим только в том случае, если dt ошибочно интерпретирует значение Name как экземпляр, а не как тип.

-i

Не отступайте подтипы.

-o

Не указывайте значения смещения полей структуры.

-p

Адрес — это физический адрес, а не виртуальный адрес.

-r[глубина]

Рекурсивно дамп полей подтипа. Если задана глубина , это рекурсия остановится после уровней глубины . Глубина должна быть цифрой от 1 до 9, и между r и глубиной не должно быть места. Переключатель -r[глубина] должен отображаться непосредственно перед адресом.

-s размер

Перечисляет только те типы, размер которых в байтах равен значению размера. Параметр -s полезен только при перечислении типов. Если задано значение -s , -e всегда подразумевается.

-t

Перечислить только типы.

-v

Подробные выходные данные. Это дает дополнительные сведения, такие как общий размер структуры и количество его элементов. Если это используется вместе с параметром поиска -y , отображаются все символы, даже те, у которых нет сведений о связанном типе.

SearchOpts
Указывает один или несколько параметров, указанных в следующей таблице. Перед этими параметрами предшествует дефис.

Вариант Описание

-n

Это означает, что следующий параметр является именем. Это следует использовать, если следующий элемент полностью состоит из шестнадцатеричных символов, так как в противном случае он будет приниматься в качестве адреса.

-y

Это означает, что следующий параметр является началом имени, а не все имя. Если параметр -y включен, все совпадения перечислены, а затем подробные сведения о первом совпадении в списке. Если значение -y не включено, будут отображаться только точные совпадения.

модуль
Необязательный параметр, указывающий модуль, определяющий эту структуру. Если есть локальная переменная или тип с тем же именем, что и глобальная переменная или тип, следует включить модуль, чтобы указать, что означает глобальную переменную. В противном случае команда dt отобразит локальную переменную, даже если локальная переменная не учитывает регистр, а глобальная переменная — это совпадение с учетом регистра.

Имя
Указывает имя типа или глобальной переменной. Если имя заканчивается звездочкой (*), отображается список всех совпадений. Таким образом, dt A\* выводит список всех типов данных, глобальных и статических значений, начиная с "A", но не будет отображать фактические экземпляры этих типов. (Если параметр отображения -v используется одновременно, все символы будут отображаться не только с данными связанного типа.) Вы также можете заменить имя точкой (.) для обозначения того, что вы хотите повторить последнее используемое значение Name.

Если имя содержит пробел, он должен быть заключен в скобки.

Поле
Указывает отображаемые поля. Если поле опущено, отображаются все поля. Если за полем следует период (.), то также будут отображаться подфилды первого уровня этого поля. Если за полем следует ряд периодов, подфилды будут отображаться на глубину, равную количеству периодов. Любое имя поля, за которым следует период, будет рассматриваться как совпадение префикса, как если бы использовался параметр поиска -y . Если за полем следует звездочка (*), оно обрабатывается как только начало поля, а не все соответствующие поля отображаются.

Адрес
Указывает адрес отображаемой структуры. Если имя опущено, адрес должен быть включен и должен указать адрес глобальной переменной. Адрес принимается как виртуальный адрес, если не указано иное. Используйте параметр -p, чтобы указать физический адрес. Используйте знак at ( @ ), чтобы указать регистр (например, @eax).

Список
Указывает имя поля, которое связывает связанный список. Параметр Address должен быть включен.

Среда

Позиция Description
Режимы Режим пользователя, режим ядра
Целевые объекты Динамический, аварийный дампа
Платформы Все

Дополнительная информация

Обзор операций с памятью и описание других команд, связанных с памятью, см. в статье "Чтение и запись памяти".

Замечания

Выходные данные команды dt всегда будут отображать подписанные номера в базовой версии 10 и без знака в шестнадцатеричном виде.

Все параметры dt, разрешающие значения символов, также разрешают строковые подстановочные знаки. Дополнительные сведения см . в синтаксисе подстановочных знаков строки.

Параметры -y и -n могут предшествовать любому имени или полю. Параметр -y позволяет указать начало типа или имени структуры. Например, dt-y ALLEN отображает данные о типе ALLENTOWN. Однако не удалось отобразить тип ALLENTOWN с dt-y A. Вместо этого необходимо использовать dt-ny A, так как A является допустимым шестнадцатеричным значением и будет интерпретирован как адрес без параметра -n.

Если имя указывает структуру, будут отображаться все поля (например, dt myStruct). Если требуется только одно конкретное поле, можно выполнить dt myStruct myField. Откроется элемент, вызывающий myStruct.myField. Однако обратите внимание, что команда dt myStruct myField1 myField2 отображает myStruct.myField1 и myStruct.myField2. Он не отображает myStruct.myField1.myField2.

Если за именем структуры или полем следует подстрок, это указывает один экземпляр массива. Например, dt myStruct myFieldArray[3] отображает четвертый элемент массива. Но если за именем типа следует подстрок, это указывает весь массив. Например, dt CHAR[8] myPtr будет отображать восьмизначную строку. Подстрок всегда принимается как десятичный, независимо от текущего радикса; Префикс 0x приведет к ошибке.

Так как команда использует сведения о типе из .PDB-файл можно свободно использовать для отладки любой платформы ЦП.

Сведения о типе, используемые dt , включают все имена типов, созданные с типом, включая все определяемые Windows типы. Например, без знака длинные и символы являются недопустимыми именами типов, но ULONG и CHAR . Полный список всех имен типов Windows см. в пакете SDK для Microsoft Windows.

Все типы, созданные typedefs в собственном коде, будут присутствовать, пока они фактически использовались в вашей программе. Однако типы, определенные в заголовках, но никогда не используемые на самом деле не будут храниться в файлах символов PDB и не будут доступны отладчику. Чтобы сделать такой тип доступным для отладчика, используйте его в качестве входных данных инструкции typedef . Например, если в коде отображается следующее, структура MY_DATA будет храниться в PDB-файле символов и может отображаться командой dt :

typedef struct _MY_DATA {
    . . .
    } MY_DATA;
typedef  MY_DATA *PMY_DATA; 

С другой стороны, следующий код не будет достаточно, поскольку оба MY_DATA и PMY_DATA определяются начальным типизированным и, следовательно, MY_DATA не использовался в качестве входных данных любого оператора typedef:

typedef struct _MY_DATA {
    . . .
    } MY_DATA, *PMY_DATA; 

В любом случае сведения о типе включаются только в полный файл символов, а не в файл символов, который был лишен всех сведений о закрытых символах. Дополнительные сведения см. в разделе "Открытые и частные символы".

Если вы хотите отобразить строки юникода, сначала необходимо использовать команду .enable_unicode (включить отображение Юникода). Вы можете управлять отображением длинных целых чисел с помощью команды .enable_long_status (включить длинное целое число).

В следующем примере dt отображает глобальную переменную:

0:000> dt mt1 
   +0x000 a                : 10
   +0x004 b                : 98 'b'
   +0x006 c                : 0xdd
   +0x008 d                : 0xabcd
   +0x00c gn               : [6] 0x1
   +0x024 ex               : 0x0 

В следующем примере dt отображает gn поля массива:

0:000> dt mt1 -a gn 
   +0x00c gn : 
    [00] 0x1
    [01] 0x2
    [02] 0x3
    [03] 0x4
    [04] 0x5
    [05] 0x6 

Следующая команда отображает некоторые подфилды переменной:

0:000> dt mcl1 m_t1 dpo 
   +0x010 dpo  : DEEP_ONE
   +0x070 m_t1 : MYTYPE1 

Следующая команда отображает подфилды поля поля m_t1. Так как период автоматически вызывает сопоставление префиксов, это также будет отображать подфилды любого поля, начинающегося с "m_t1":

0:000> dt mcl1 m_t1. 
   +0x070 m_t1  : 
      +0x000 a     : 0
      +0x004 b     : 0 '
      +0x006 c     : 0x0
      +0x008 d     : 0x0
      +0x00c gn    : [6] 0x0
      +0x024 ex    : 0x0 

Вы можете повторить это на любую глубину. Например, команда dt mcl1 a.. c. отображает все поля для глубины четырех, таким образом, что имя первого поля началось с имени третьего поля, начинающегося с c.

Ниже приведен более подробный пример отображения подфилдов. Во-первых, отобразите поле Ldr :

0:000> dt nt!_PEB Ldr 7ffdf000 
   +0x00c Ldr : 0x00191ea0 

Теперь разверните поле типа указателя:

0:000> dt nt!_PEB Ldr Ldr. 7ffdf000 
   +0x00c Ldr  : 0x00191ea0
      +0x000 Length : 0x28
      +0x004 Initialized : 0x1 '
      +0x008 SsHandle : (null)
      +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
      +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
      +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
      +0x024 EntryInProgress : (null) 

Теперь отобразится поле CriticalSectionTimeout :

0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000 
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000 

Теперь разверните подфилды структуры CriticalSectionTimeout на одном уровне:

0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000 
   +0x070 CriticalSectionTimeout  :  0xffffe86d`079b8000
      +0x000 LowPart                 : 0x79b8000
      +0x004 HighPart                : -6035
      +0x000 u                       : __unnamed
      +0x000 QuadPart                : -25920000000000 

Теперь разверните подфилды структуры CriticalSectionTimeout на двух уровнях:

0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000 
   +0x070 CriticalSectionTimeout   :  0xffffe86d`079b8000
      +0x000 LowPart                  : 0x79b8000
      +0x004 HighPart                 : -6035
      +0x000 u                        :
         +0x000 LowPart                  : 0x79b8000
         +0x004 HighPart                 : -6035
      +0x000 QuadPart                 : -25920000000000 

Следующая команда отображает экземпляр типа данных MYTYPE1, расположенный по адресу 0x0100297C:

0:000> dt 0x0100297c MYTYPE1 
   +0x000 a                : 22
   +0x004 b                : 43 '+'
   +0x006 c                : 0x0
   +0x008 d                : 0x0
   +0x00c gn               : [6] 0x0
   +0x024 ex               : 0x0 

Следующая команда отображает массив из 10 ULONG по адресу 0x01002BE0:

0:000> dt -ca10 ULONG 01002be0 
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0 

Следующая команда продолжает отображение предыдущего адреса по другому адресу. Обратите внимание, что "ULONG" не требуется повторно вводить:

0:000> dt -ca4 . 01002d00 
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2 

Ниже приведены некоторые примеры отображения типов. Следующая команда отображает все типы и глобальные значения, начиная со строки "MY" в модуле этого модуля. Эти префиксы с адресом являются фактическими экземплярами; те, которые без адресов являются определениями типов:

0:000> dt thismodule!MY* 
010029b8  thismodule!myglobal1
01002990  thismodule!myglobal2
          thismodule!MYCLASS1
          thismodule!MYCLASS2
          thismodule!MYCLASS3
          thismodule!MYTYPE3::u
          thismodule!MYTYPE1
          thismodule!MYTYPE3
          thismodule!MYTYPE3
          thismodule!MYFLAGS 

При отображении типа параметр -v можно использовать для отображения размера каждого элемента. Параметр размера -s можно использовать только для перечисления элементов определенного размера. Опять же, эти префиксы с адресом являются фактическими экземплярами; те, которые без адресов являются определениями типов:

0:001> dt -s 2 -v thismodule!* 
Enumerating symbols matching thismodule!*, Size = 0x2
Address   Size Symbol
           002 thismodule!wchar_t
           002 thismodule!WORD
           002 thismodule!USHORT
           002 thismodule!SHORT
           002 thismodule!u_short
           002 thismodule!WCHAR
00427a34   002 thismodule!numberOfShips
00427a32   002 thismodule!numberOfPlanes
00427a30   002 thismodule!totalNumberOfItems 

Ниже приведен пример параметра -b . Структура расширяется и массив OwnerThreads в структуре расширяется, но указатели списка Flink и Blink не следуют:

kd> dt nt!_ERESOURCE -b 0x8154f040 
   +0x000 SystemResourcesList :  [ 0x815bb388 - 0x816cd478 ]
      +0x000 Flink            : 0x815bb388
      +0x004 Blink            : 0x816cd478
   +0x008 OwnerTable       : (null)
   +0x00c ActiveCount      : 1
   +0x00e Flag             : 8
   +0x010 SharedWaiters    : (null)
   +0x014 ExclusiveWaiters : (null)
   +0x018 OwnerThreads     :
    [00]
      +0x000 OwnerThread      : 0
      +0x004 OwnerCount       : 0
      +0x004 TableSize        : 0
    [01]
      +0x000 OwnerThread      : 0x8167f563
      +0x004 OwnerCount       : 1
      +0x004 TableSize        : 1
   +0x028 ContentionCount  : 0
   +0x02c NumberOfSharedWaiters : 0
   +0x02e NumberOfExclusiveWaiters : 0
   +0x030 Address          : (null)
   +0x030 CreatorBackTraceIndex : 0
   +0x034 SpinLock         : 0

Ниже приведен пример dt в режиме ядра. Следующая команда создает результаты, аналогичные !process 0 0:

kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0 
## ActiveProcessLinks.Flink at 0x814856f0

UniqueProcessId : 0x00000008
ImageFileName : [16] "System"

## ActiveProcessLinks.Flink at 0x8138a030

UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"

## ActiveProcessLinks.Flink at 0x81372368

UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"

## ActiveProcessLinks.Flink at 0x81369930

UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"

.... 

Если вы хотите выполнить команду для каждого элемента списка, используйте расширение !list .

Наконец, команда dt -h отобразит короткий текст справки, суммируя синтаксис dt .