dt (Tipo de Exibição)

O comando dt exibe informações sobre uma variável local, variável global ou tipo de dados. Isso pode exibir informações sobre tipos de dados simples, bem como estruturas e uniões.

Sintaxe User-Mode

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

Sintaxe Kernel-Mode

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

Parâmetros

Processador
Especifica o processador que está executando o processo que contém as informações necessárias. Para obter mais informações, consulte Sintaxe multiprocessador. Os processadores só podem ser especificados no modo kernel.

DisplayOpts
Especifica uma ou mais das opções fornecidas na tabela a seguir. Essas opções são precedidas por um hífen.

Opção Descrição

-a[quantity]

Mostrar cada elemento de matriz em uma nova linha, com seu índice. Um total de elementos de quantidade será exibido. Não deve haver espaço entre a e a quantidade. Se -a não for seguido por um dígito, todos os itens na matriz serão mostrados. A opção -a[quantity] deve aparecer imediatamente antes de cada nome de tipo ou nome de campo que você deseja exibir dessa maneira.

-b

Exibir blocos recursivamente. Se uma estrutura exibida contiver subestruturas, ela será expandida recursivamente para profundidades arbitrárias e exibida na íntegra. Os ponteiros serão expandidos somente se estiverem na estrutura original, não em subestruturas.

-c

Saída compacta. Todos os campos são exibidos em uma linha, se possível. (Quando usado com a opção - a, cada elemento de matriz usa uma linha em vez de ser formatado como um bloco de várias linhas.)

-d

Quando usado com um Nome que é encerrado com um asterisco, exiba a saída detalhada para todos os tipos que começam com Name. Se Name não terminar com um asterisco, exiba a saída detalhada.

-e

Força o dt a enumerar tipos. Essa opção só será necessária se dt estiver interpretando erroneamente o valor name como uma instância em vez de como um tipo.

-i

Não recuar os subtipos.

-o

Omita valores de deslocamento dos campos de estrutura.

-p

O endereço é um endereço físico, em vez de um endereço virtual.

-r[depth]

Despeja recursivamente os campos de subtipo. Se a profundidade for fornecida, essa recursão será interrompida após os níveis de profundidade . A profundidade deve ser um dígito entre 1 e 9 e não deve haver espaço entre o r e a profundidade. A opção -r[depth] deve aparecer imediatamente antes do endereço.

-ssize

Enumerar somente os tipos cujo tamanho em bytes é igual ao valor de tamanho. A opção -s só é útil quando os tipos estão sendo enumerados. Quando -s é especificado, -e é sempre implícito também.

-t

Enumerar somente tipos.

-v

Saída detalhada. Isso fornece informações adicionais, como o tamanho total de uma estrutura e o número de seus elementos. Quando isso é usado junto com a opção de pesquisa -y , todos os símbolos são exibidos, mesmo aqueles sem informações de tipo associadas.

SearchOpts
Especifica uma ou mais das opções fornecidas na tabela a seguir. Essas opções são precedidas por um hífen.

Opção Descrição

-n

Isso indica que o próximo parâmetro é um nome. Isso deve ser usado se o próximo item consistir inteiramente de caracteres hexadecimais, pois, de outra forma, ele será usado como um endereço.

-y

Isso indica que o próximo parâmetro é o início do nome, não necessariamente o nome inteiro. Quando -y é incluído, todas as correspondências são listadas, seguidas por informações detalhadas sobre a primeira correspondência na lista. Se -y não estiver incluído, somente as correspondências exatas serão exibidas.

Módulo
Um parâmetro opcional que especifica o módulo que define essa estrutura. Se houver uma variável ou tipo local com o mesmo nome de uma variável ou tipo global, você deverá incluir o módulo para especificar que você quer dizer a variável global. Caso contrário, o comando dt exibirá a variável local, mesmo que a variável local não seja uma correspondência que não diferencia maiúsculas de minúsculas e a variável global diferencia maiúsculas de minúsculas.

Nome
Especifica o nome de um tipo ou variável global. Se Name terminar com um asterisco (*), uma lista de todas as correspondências será exibida. Assim, o dt A\* listará todos os tipos de dados, globais e estáticos começando com "A", mas não exibirá as instâncias reais desses tipos. (Se a opção de exibição -v for usada ao mesmo tempo, todos os símbolos serão exibidos , não apenas aqueles com informações de tipo associadas.) Você também pode substituir Name por um ponto (.) para indicar que deseja repetir o valor usado mais recentemente de Name.

Se Name contiver um espaço, ele deverá ser colocado entre parênteses.

Campo
Especifica os campos a serem exibidos. Se Field for omitido, todos os campos serão exibidos. Se Field for seguido por um ponto (.), os subcampos de primeiro nível desse campo também serão exibidos. Se Field for seguido com uma série de períodos, os subcampos serão exibidos para uma profundidade igual ao número de períodos. Qualquer nome de campo seguido por um período será tratado como uma correspondência de prefixo, como se a opção de pesquisa -y fosse usada. Se Field for seguido por um asterisco (*), ele será tratado apenas como o início do campo, não necessariamente todo o campo e todos os campos correspondentes serão exibidos.

Endereço
Especifica o endereço da estrutura a ser exibida. Se Name for omitido, Address deverá ser incluído e deverá especificar o endereço de uma variável global. O endereço é considerado um endereço virtual, a menos que especificado de outra forma. Use a opção -p para especificar um endereço físico. Use um sinal "at" ( @ ) para especificar um registro (por exemplo, @eax).

Lista
Especifica o nome do campo que vincula uma lista vinculada. O parâmetro Address deve ser incluído.

Ambiente

Item Descrição
Modos Modo de usuário, modo kernel
Destinos Ao vivo, despejo de memória
Plataformas Tudo

Informações adicionais

Para obter uma visão geral da manipulação de memória e uma descrição de outros comandos relacionados à memória, consulte Leitura e gravação de memória.

Comentários

A saída do comando dt sempre exibirá números assinados na base 10 e números não assinados em hexadecimal.

Todos os parâmetros de dt que permitem valores de símbolo também permitem caracteres curinga de cadeia de caracteres. Consulte Sintaxe curinga de cadeia de caracteres para obter detalhes.

As opções -y e -n podem preceder qualquer Nome ou Campo. A opção -y permite que você especifique o início do nome do tipo ou da estrutura. Por exemplo, dt -y ALLEN exibirá dados sobre o tipo ALLENTOWN. No entanto, não foi possível exibir o tipo ALLENTOWN com dt -y A. Em vez disso, você teria que usar dt -ny A, porque A é um valor hexadecimal válido e seria interpretado como um endereço sem a opção -n .

Se Name indicar uma estrutura, todos os campos serão exibidos (por exemplo, dt myStruct). Se você quiser apenas um campo específico, poderá fazer dt myStruct myField. Isso exibe o membro que C chamaria myStruct.myField. No entanto, observe que o comando dt myStruct myField1 myField2 exibe myStruct.myField1 e myStruct.myField2. Ele não exibe myStruct.myField1.myField2.

Se um nome ou campo de estrutura for seguido por um subscrito, isso especificará uma única instância de uma matriz. Por exemplo, dt myStruct myFieldArray[3] exibirá o quarto elemento da matriz em questão. Mas se um nome de tipo for seguido por um subscrito, isso especificará uma matriz inteira. Por exemplo, dt CHAR[8] myPtr exibirá uma cadeia de caracteres de oito caracteres. O subscrito é sempre tomado como decimal, independentemente do radix atual; um prefixo 0x causará um erro.

Porque o comando usa informações de tipo do . arquivo pdb , ele pode ser usado livremente para depurar qualquer plataforma de CPU.

As informações de tipo usadas pelo dt incluem todos os nomes de tipo criados com typedef, incluindo todos os tipos definidos pelo Windows. Por exemplo, long e charsem sinal não são nomes de tipo válidos, mas ULONG e CHAR são. Consulte o SDK do Microsoft Windows para obter uma lista completa de todos os nomes de tipo do Windows.

Todos os tipos criados por typedefs em seu próprio código estarão presentes, desde que tenham sido realmente usados em seu programa. No entanto, os tipos definidos em seus cabeçalhos, mas nunca realmente usados, não serão armazenados nos arquivos de símbolo .pdb e não poderão ser acessados pelo depurador. Para disponibilizar esse tipo para o depurador, use-o como a entrada de uma instrução typedef . Por exemplo, se o seguinte aparecer em seu código, a estrutura MY_DATA será armazenada no arquivo de símbolo .pdb e poderá ser exibida pelo comando dt :

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

Por outro lado, o código a seguir não seria suficiente porque MY_DATA e PMY_DATA são definidos pelo typedef inicial e, portanto, MY_DATA não foi usado como a entrada de qualquer instrução typedef :

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

De qualquer forma, as informações de tipo são incluídas apenas em um arquivo de símbolo completo, não em um arquivo de símbolo que foi removido de todas as informações de símbolo privado. Para obter mais informações, consulte Símbolos públicos e privados.

Se você quiser exibir cadeias de caracteres unicode, precisará usar o comando .enable_unicode (Habilitar Exibição Unicode) primeiro. Você pode controlar a exibição de inteiros longos com o comando .enable_long_status (Habilitar Exibição de Inteiro Longo).

No exemplo a seguir, dt exibe uma variável global:

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

No exemplo a seguir, dt exibe o campo de matriz gn:

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

O comando a seguir exibe alguns subcampos de uma variável:

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

O comando a seguir exibe os subcampos do campo m_t1. Como o período causa automaticamente a correspondência de prefixo, isso também exibirá subcampos de qualquer campo que comece com "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 

Você pode repetir isso a qualquer profundidade. Por exemplo, o comando dt mcl1 a.. c. exibiria todos os campos para profundidade quatro, de modo que o nome do primeiro campo começou com um e o terceiro nome de campo começou com c.

Aqui está um exemplo mais detalhado de como os subcampos podem ser exibidos. Primeiro, exiba o campo Ldr :

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

Agora expanda o campo tipo de ponteiro:

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) 

Agora, exiba o campo CriticalSectionTimeout :

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

Agora expanda os subcampos de estrutura CriticalSectionTimeout de um nível profundo:

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

Agora expanda os subcampos da estrutura CriticalSectionTimeout com dois níveis de profundidade:

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 

O comando a seguir exibe uma instância do tipo de dados MYTYPE1 localizada no endereço 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 

O comando a seguir exibe uma matriz de 10 ULONGs no endereço 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 

O comando a seguir continua a exibição anterior em um endereço diferente. Observe que "ULONG" não precisa ser reinserido:

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

Aqui estão alguns exemplos de exibição de tipo. O comando a seguir exibe todos os tipos e globais começando com a cadeia de caracteres "MY" no módulo thismodule. Aqueles prefixados com um endereço são instâncias reais; aqueles sem endereços são definições de tipo:

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 

Ao executar a exibição de tipo, a opção -v pode ser usada para exibir o tamanho de cada item. A opção de tamanho-s pode ser usada apenas para enumerar itens de um tamanho específico. Novamente, aqueles prefixados com um endereço são instâncias reais; aqueles sem endereços são definições de tipo:

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 

Aqui está um exemplo da opção -b . A estrutura é expandida e a matriz OwnerThreads dentro da estrutura é expandida, mas os ponteiros da lista Flink e Blink não são seguidos:

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

Aqui está um exemplo de dt no modo kernel. O comando a seguir produz resultados semelhantes a !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"

.... 

Se você quiser executar um comando para cada elemento da lista, use a extensão !list .

Por fim, o comando dt -h exibirá um texto de ajuda curto resumindo a sintaxe dt .