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 .