dt (tipo di visualizzazione)

Il comando dt visualizza informazioni su una variabile locale, una variabile globale o un tipo di dati. Ciò può visualizzare informazioni sui tipi di dati semplici, nonché strutture e unioni.

sintassi User-Mode

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

sintassi Kernel-Mode

[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[quantità]

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

-b

Visualizzare i blocchi ricorsivi. Se una struttura visualizzata contiene sottostruttura, 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 sottostruttura.

-c

Output compatto. Tutti i campi vengono visualizzati su una riga, se possibile. Quando viene usato con l'opzione -a , ogni elemento matrice accetta una riga anziché essere formattata come blocco a linee diverse.

-d

Quando viene 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 rientro dei 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 arresterà dopo i livelli di profondità . La profondità deve essere una cifra compresa tra 1 e 9 e non deve esserci spazio tra r eprofondità. L'opzione -r[depth] deve essere visualizzata immediatamente prima dell'indirizzo.

-ssize

Enumera solo i tipi le cui dimensioni in byte sono uguali al valore di dimensione. L'opzione -s è utile solo quando i tipi vengono enumerati. Quando viene specificato -s , -e è sempre implicito.

-t

Enumerare solo i tipi.

-v

Output dettagliato. In questo modo vengono fornite informazioni aggiuntive, ad esempio la dimensione totale 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

Questo indica che il parametro successivo è un nome. Questa operazione deve essere usata se l'elemento successivo è costituito interamente da caratteri esadecimali, perché altrimenti verrà preso come indirizzo.

-Y

Questo indica che il parametro successivo è l'inizio del nome, non necessariamente l'intero nome. Quando -y è incluso, tutte le corrispondenze sono elencate, 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 locale o un tipo con lo stesso nome di una variabile globale o un tipo, è 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 una variabile di tipo o globale. Se Nome termina con un asterisco (*), viene visualizzato un elenco di tutte le corrispondenze. Pertanto, dt A\* elenca tutti i tipi di dati, le globali e gli statici a partire da "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 associati. È anche possibile sostituire Name con un punto (.) per firmare che si vuole ripetere il valore usato più di recente di Name.

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

Campo
Specifica i campi da visualizzare. Se il campo 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 campi secondari verranno visualizzati in modo approfondito 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 tutti i campi corrispondenti vengono visualizzati.

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

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

Ambiente

Elemento Descrizione
Modalità Modalità utente, modalità kernel
Targets Dump live, arresto anomalo
Piattaforme Tutti

Informazioni aggiuntive

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

Commenti

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

Tutti i parametri di dt che consentono i valori dei simboli 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 tipo o del nome della struttura. Ad esempio, dt -y ALLEN visualizzerà i dati sul tipo ALLENTOWN. Tuttavia, non è possibile visualizzare il tipo ALLENTOWN con dt -y A. È 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, tutti i campi verranno visualizzati, ad esempio dt myStruct. Se si vuole solo un campo specifico, è possibile eseguire dt myStruct myField. Viene 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 della struttura viene seguito da un sottoscritto, questa 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 sottoscritto, questo specifica un'intera matrice. Ad esempio, dt CHAR[8] myPtr visualizzerà una stringa di otto caratteri. Il sottoscritto viene sempre preso come decimale indipendentemente dal radix corrente; un prefisso 0x causerà un errore.

Poiché il comando usa le informazioni sui tipi 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 and char non sono nomi di tipo validi, ma ULONG e CHAR sono. Per un elenco completo di tutti i nomi dei tipi di Windows, vedere la 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 in realtà non verranno archiviati nei file di simboli con estensione pdb e non saranno accessibili al debugger. Per rendere disponibile tale tipo al debugger, usarlo come input di un'istruzione typedef . Ad esempio, se nel codice viene visualizzato il codice seguente, 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, pertanto, 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 le stringhe unicode, è necessario usare prima il comando .enable_unicode (Abilita visualizzazione Unicode). È possibile controllare la visualizzazione di 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 campi secondari 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 del prefisso, verrà visualizzato anche 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 in qualsiasi profondità. Ad esempio, il comando dt mcl1 a.. c. visualizzava tutti i campi in profondità quattro, in modo che il nome del primo campo iniziasse con un e il terzo nome del campo iniziava con c.

Ecco un esempio più dettagliato del modo in cui è possibile visualizzare i campi secondari. In primo luogo, visualizzare 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 il sottocampo della struttura CriticalSectionTimeout un livello profondo:

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 due livelli profondi:

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 all'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 dei tipi. Il comando seguente visualizza tutti i tipi e le globalità a partire dalla stringa "MY" nel modulo thismodule. Tali 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 -ssize può essere usata per enumerare solo gli elementi di una dimensione specifica. Anche in questo caso, tali prefissi con 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 

Ecco un esempio dell'opzione -b . La struttura viene espansa e la matrice OwnerThreads all'interno della struttura viene espansa, ma i puntatori di 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 riepilogo del testo della Guida che riepiloga la sintassi dt .