Partilhar via


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 do modo de usuário

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

Sintaxe do modo kernel

[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 do multiprocessador. Os processadores só podem ser especificados no modo kernel.

Opção de exibição
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[quantidade]

Mostre cada elemento da matriz em uma nova linha, com seu índice. Um total de elementos de quantidade será exibido. Não deve haver espaço entre o 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

Blocos de exibição recursivamente. Se uma estrutura exibida contiver subestruturas, ela será expandida recursivamente para profundidades arbitrárias e exibida na íntegra. Os ponteiros sã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 termina com um asterisco, exiba uma saída detalhada para todos os tipos que começam com Nome. Se Nome não terminar com um asterisco, exiba a saída detalhada.

-e

Força 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 recue os subtipos.

-o

Omita os valores de deslocamento dos campos de estrutura.

-p

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

-r[profundidade]

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.

- tamanho de s

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

-t

Enumerar apenas 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 em caracteres hexadecimais, porque, caso contrário, será considerado 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, apenas 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 local ou tipo com o mesmo nome de uma variável ou tipo global, você deverá incluir module 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 diferencie maiúsculas de minúsculas e a variável global seja uma correspondência que diferencia maiúsculas de minúsculas.

Nome
Especifica o nome de um tipo ou variável global. Se Nome terminar com um asterisco (*), uma lista de todas as correspondências será exibida. Assim, 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 Nome por um ponto (.) para indicar que deseja repetir o valor usado mais recentemente de Nome.

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

Campo
Especifica o(s) campo(s) a serem exibidos. Se Campo for omitido, todos os campos serão exibidos. Se Campo for seguido por um ponto (.), os subcampos de primeiro nível desse campo também serão exibidos. Se Campo for seguido por uma série de períodos, os subcampos serão exibidos com uma profundidade igual ao número de períodos. Qualquer nome de campo seguido por um ponto será tratado como uma correspondência de prefixo, como se a opção de pesquisa -y fosse usada. Se Campo for seguido por um asterisco (*), ele será tratado apenas como o início do campo, não necessariamente o campo inteiro, 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 de "arroba" ( @ ) 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 saber em linhas gerais sobre a manipulação de memória e ler uma descrição de outros comandos relacionados à memória, consulte Memória de leitura e de gravação.

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 curingas de string. 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 especificar o início do nome do tipo ou da estrutura. Por exemplo, dt -y ALLEN exibirá dados sobre o tipo ALLENTOWN. No entanto, você não pode 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, você pode 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 de estrutura ou campo for seguido por um subscrito, isso especificará uma única instância de uma matriz. Por exemplo, dt myStruct myFieldArray[3] exibirá o quarto elemento do array 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 string de oito caracteres. O subscrito é sempre considerado decimal, independentemente da base atual; Um prefixo 0x causará um erro.

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

As informações de tipo usadas por dt incluem todos os nomes de tipo criados com typedef, incluindo todos os tipos definidos pelo Windows. Por exemplo, unsigned long e char 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 dentro de 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 estarão acessíveis ao 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 tanto MY_DATA quanto PMY_DATA são definidos pelo typedef inicial e, portanto, MY_DATA não foi usado como entrada de nenhuma 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, confira Símbolos Públicos e Privados.

Se você quiser exibir strings unicode, precisará usar o comando .enable_unicode (Ativar exibição Unicode) primeiro. Você pode controlar a exibição de inteiros longos com o comando .enable_long_status (Ativar exibição de inteiros longos).

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 ponto 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 em qualquer profundidade. Por exemplo, o comando dt mcl1 a.. c. exibiria todos os campos até a profundidade quatro, de modo que o primeiro nome de campo começasse com a e o terceiro nome de campo começasse 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 do 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 da estrutura CriticalSectionTimeout com um nível de profundidade:

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 que está 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 inserido novamente:

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 que começam 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 -s size 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 .

Finalmente, o comando dt -h exibirá um pequeno texto de ajuda resumindo a sintaxe dt .