Condividi tramite


dt (tipo di visualizzazione)

Il comando dt visualizza informazioni su una variabile locale, una variabile globale o un tipo di dati. In questo modo è possibile visualizzare informazioni sui tipi di dati semplici, nonché sulle strutture e le unioni.

Sintassi in modalità utente

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

Sintassi in modalità kernel

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

Parametri

Processore
Specifica il processore che esegue il processo contenente le informazioni necessarie. Per altre informazioni, vedere Sintassi multiprocessore. I processori possono essere specificati solo in modalità kernel.

DisplayOpts
Specifica una o più delle opzioni specificate nella tabella seguente. Queste opzioni sono precedute da un trattino.

Opzione Descrizione

-a[quantity]

Mostra ogni elemento della matrice su una nuova riga, con il relativo indice. Verrà visualizzato un totale di elementi di quantità . Non deve esserci spazio tra l'oggetto e la quantità. Se -a non è seguito da una cifra, vengono visualizzati tutti gli elementi nella matrice. L'opzione -a[quantity] dovrebbe essere visualizzata immediatamente prima di ogni nome di tipo o nome di campo che si desidera visualizzare in questo modo.

-b

Visualizza i blocchi in modo ricorsivo. Se una struttura visualizzata contiene sottostrutture, viene espansa in modo ricorsivo a profondità arbitrarie e visualizzate in modo completo. I puntatori vengono espansi solo se si trovano nella struttura originale, non nelle sottostrutture.

-c

Output compatto. Tutti i campi vengono visualizzati su una riga, se possibile. Se usato con l'opzione -a , ogni elemento della matrice accetta una riga anziché essere formattata come blocco a più righe.

-d

Se usato con un nome terminato con un asterisco, visualizzare l'output dettagliato per tutti i tipi che iniziano con Name. Se Name non termina con un asterisco, visualizzare l'output dettagliato.

-e

Forza dt ad enumerare i tipi. Questa opzione è necessaria solo se dt interpreta erroneamente il valore Name come istanza anziché come tipo.

-i

Non rientrare i sottotipi.

-o

Omettere i valori di offset dei campi della struttura.

-p

L'indirizzo è un indirizzo fisico, anziché un indirizzo virtuale.

-r[depth]

Esegue il dump ricorsivo dei campi del sottotipo. Se viene specificata la profondità , questa ricorsione si interromperà dopo i livelli di profondità . La profondità deve essere una cifra compresa tra 1 e 9 e non deve esserci spazio tra r e la profondità. L'opzione -r[depth] dovrebbe essere visualizzata immediatamente prima dell'indirizzo.

-s dimensioni

Enumerare solo i tipi le cui dimensioni in byte sono uguali al valore di size. L'opzione -s è utile solo quando i tipi vengono enumerati. Quando si specifica -s , -e è sempre implicito.

-t

Enumerare solo i tipi.

-v

Output dettagliato. In questo modo vengono fornite informazioni aggiuntive, ad esempio le dimensioni totali di una struttura e il numero dei relativi elementi. Quando viene usato insieme all'opzione di ricerca -y , vengono visualizzati tutti i simboli, anche quelli senza informazioni sul tipo associate.

SearchOpts
Specifica una o più delle opzioni specificate nella tabella seguente. Queste opzioni sono precedute da un trattino.

Opzione Descrizione

-n

Indica che il parametro successivo è un nome. Questa operazione deve essere utilizzata se l'elemento successivo è costituito interamente da caratteri esadecimali, perché in caso contrario verrà usato come indirizzo.

-y

Ciò indica che il parametro successivo è l'inizio del nome, non necessariamente l'intero nome. Quando -y è incluso, vengono elencate tutte le corrispondenze, seguite da informazioni dettagliate sulla prima corrispondenza nell'elenco. Se -y non è incluso, verranno visualizzate solo corrispondenze esatte.

modulo
Parametro facoltativo che specifica il modulo che definisce questa struttura. Se è presente una variabile o un tipo locale con lo stesso nome di una variabile o un tipo globale, è necessario includere il modulo per specificare che si intende la variabile globale. In caso contrario, il comando dt visualizzerà la variabile locale, anche se la variabile locale è una corrispondenza senza distinzione tra maiuscole e minuscole e la variabile globale è una corrispondenza con distinzione tra maiuscole e minuscole.

Nome
Specifica il nome di un tipo o di una variabile globale. Se Name termina con un asterisco (*), viene visualizzato un elenco di tutte le corrispondenze. Dt A\* elenca quindi tutti i tipi di dati, le globali e gli statici che iniziano con "A", ma non visualizzeranno le istanze effettive di questi tipi. Se l'opzione di visualizzazione -v viene usata contemporaneamente, verranno visualizzati tutti i simboli, non solo quelli con le informazioni sul tipo associate. È anche possibile sostituire Name con un punto (.) per indicare che si desidera ripetere il valore usato più di recente di Name.

Se Name contiene uno spazio, deve essere racchiuso tra parentesi.

Campo
Specifica i campi da visualizzare. Se Field viene omesso, vengono visualizzati tutti i campi. Se Field è seguito da un punto (.), verranno visualizzati anche i sottocampi di primo livello di questo campo. Se Field viene seguito con una serie di periodi, i sottocampi verranno visualizzati con una profondità uguale al numero di periodi. Qualsiasi nome di campo seguito da un punto verrà considerato come una corrispondenza di prefisso, come se fosse stata usata l'opzione di ricerca -y . Se Field è seguito da un asterisco (*), viene considerato come solo l'inizio del campo, non necessariamente l'intero campo e vengono visualizzati tutti i campi corrispondenti.

Indirizzo
Specifica l'indirizzo della struttura da visualizzare. Se Name viene omesso, l'indirizzo deve essere incluso e deve specificare l'indirizzo di una variabile globale. L'indirizzo viene impiegato come indirizzo virtuale, a meno che non sia specificato diversamente. Usare l'opzione -p per specificare un indirizzo fisico. Usare un segno "at" ( @ ) per specificare un registro (ad esempio, @eax).

Lista
Specifica il nome del campo che collega un elenco collegato. Il parametro Address deve essere incluso.

Ambiente

Articolo Descrizione
Modalità Modalità utente, modalità kernel
Target Live, crash dump
Piattaforme Tutte le date

Informazioni aggiuntive

Per una panoramica della manipolazione della memoria e di una descrizione di altri comandi correlati alla memoria, vedere Lettura e scrittura di memoria.

Osservazioni:

L'output del comando dt visualizzerà sempre numeri firmati in base 10 e numeri senza segno in formato esadecimale.

Tutti i parametri di dt che consentono valori simbolo consentono anche caratteri jolly stringa. Per informazioni dettagliate, vedere Sintassi con caratteri jolly stringa.

Le opzioni -y e -n possono precedere qualsiasi nome o campo. L'opzione -y consente di specificare l'inizio del nome del tipo o della struttura. Ad esempio, dt -y ALLEN visualizzerà i dati sul tipo ALLENTOWN. Tuttavia, non è possibile visualizzare il tipo ALLENTOWN con dt -y A. Sarebbe invece necessario usare dt -ny A, perché A è un valore esadecimale valido e verrebbe interpretato come indirizzo senza l'opzione -n .

Se Name indica una struttura, verranno visualizzati tutti i campi, ad esempio dt myStruct. Se si vuole solo un campo specifico, è possibile eseguire dt myStruct myField. Verrà visualizzato il membro che C chiamerebbe myStruct.myField. Si noti tuttavia che il comando dt myStruct myField1 myField2 visualizza myStruct.myField1 e myStruct.myField2. Non visualizza myStruct.myField1.myField2.

Se un nome o un campo di struttura è seguito da un pedice, specifica una singola istanza di una matrice. Ad esempio, dt myStruct myFieldArray[3] visualizzerà il quarto elemento della matrice in questione. Tuttavia, se un nome di tipo è seguito da un pedice, viene specificata un'intera matrice. Ad esempio, dt CHAR[8] myPtr visualizzerà una stringa di otto caratteri. L'indice viene sempre preso come decimale indipendentemente dal radix corrente; un prefisso 0x genererà un errore.

Poiché il comando usa informazioni sul tipo da .file pdb , può essere usato liberamente per eseguire il debug di qualsiasi piattaforma CPU.

Le informazioni sul tipo usate da dt includono tutti i nomi dei tipi creati con typedef, inclusi tutti i tipi definiti da Windows. Ad esempio, unsigned long e char non sono nomi di tipo validi, ma ULONG e CHAR sono. Per un elenco completo di tutti i nomi dei tipi di Windows, vedi Microsoft Windows SDK.

Tutti i tipi creati da typedef all'interno del proprio codice saranno presenti, purché siano stati effettivamente usati nel programma. Tuttavia, i tipi definiti nelle intestazioni ma mai usati non verranno archiviati nei file di simboli con estensione pdb e non saranno accessibili al debugger. Per rendere tale tipo disponibile per il debugger, usarlo come input di un'istruzione typedef. Ad esempio, se nel codice viene visualizzato quanto segue, la struttura MY_DATA verrà archiviata nel file di simboli con estensione pdb e può essere visualizzata dal comando dt :

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

D'altra parte, il codice seguente non sarebbe sufficiente perché sia MY_DATA che PMY_DATA sono definiti dal typedef iniziale e, di conseguenza, MY_DATA non è stato usato come input di qualsiasi istruzione typedef:

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

In qualsiasi caso, le informazioni sul tipo sono incluse solo in un file di simboli completo, non in un file di simboli che è stato rimosso da tutte le informazioni sui simboli privati. Per altre informazioni, vedere Simboli pubblici e privati.

Se si desidera visualizzare stringhe Unicode, è prima necessario usare il comando .enable_unicode (Abilita visualizzazione Unicode). È possibile controllare la visualizzazione di numeri interi lunghi con il comando .enable_long_status (Abilita visualizzazione intero lungo).

Nell'esempio seguente dt visualizza una variabile globale:

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

Nell'esempio seguente dt visualizza il campo matrice gn:

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

Il comando seguente visualizza alcuni sottocampi di una variabile:

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

Il comando seguente visualizza i sottocampi del campo m_t1. Poiché il punto causa automaticamente la corrispondenza dei prefissi, verranno visualizzati anche i sottocampi di qualsiasi campo che inizia con "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 

È possibile ripetere questa operazione a qualsiasi profondità. Ad esempio, il comando dt mcl1 a.. c. visualizza tutti i campi fino alla profondità quattro, in modo che il nome del primo campo inizi con un e il terzo nome di campo inizia con c.

Di seguito è riportato un esempio più dettagliato del modo in cui è possibile visualizzare i sottocampi. Visualizzare innanzitutto il campo Ldr :

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

Espandere ora il campo tipo di puntatore:

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) 

Visualizzare ora il campo CriticalSectionTimeout :

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

Espandere ora i sottocampi della struttura CriticalSectionTimeout di un livello:

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

Espandere ora il sottocampo della struttura CriticalSectionTimeout in due livelli:

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 

Il comando seguente visualizza un'istanza del tipo di dati MYTYPE1 che si trova nell'indirizzo 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 

Il comando seguente visualizza una matrice di 10 ULONG nell'indirizzo 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 

Il comando seguente continua la visualizzazione precedente in un indirizzo diverso. Si noti che "ULONG" non deve essere nuovamente immesso:

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

Ecco alcuni esempi di visualizzazione del tipo. Il comando seguente visualizza tutti i tipi e i global che iniziano con la stringa "MY" nel modulo thismodule. Questi prefissi con un indirizzo sono istanze effettive; quelli senza indirizzi sono definizioni di 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 

Quando si esegue la visualizzazione del tipo, è possibile usare l'opzione -v per visualizzare le dimensioni di ogni elemento. L'opzione -s size può essere usata solo per enumerare gli elementi di una dimensione specifica. Anche in questo caso, quelli preceduti da un indirizzo sono istanze effettive; quelli senza indirizzi sono definizioni di 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 

Di seguito è riportato un esempio dell'opzione -b . La struttura viene espansa e la matrice OwnerThreads all'interno della struttura viene espansa, ma i puntatori dell'elenco Flink e Blink non vengono seguiti:

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

Ecco un esempio di dt in modalità kernel. Il comando seguente genera risultati simili 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 si vuole eseguire un comando per ogni elemento dell'elenco, usare l'estensione !list .

Infine, il comando dt -h visualizzerà un breve testo della Guida che riepiloga la sintassi dt .