x (esaminare i simboli)
Il comando x visualizza i simboli in tutti i contesti che corrispondono al modello specificato.
x [Options] Module!Symbol
x [Options] *
Parametri
Opzioni Specifica le opzioni di ricerca dei simboli. È possibile usare una o più delle opzioni seguenti:
/0
Visualizza solo l'indirizzo di ogni simbolo.
/1
Visualizza solo il nome di ogni simbolo.
/2
Visualizza solo l'indirizzo e il nome di ogni simbolo (non il tipo di dati).
/D
Visualizza l'output tramite Debugger Markup Language.
/t
Visualizza il tipo di dati di ogni simbolo, se il tipo di dati è noto.
/v
Visualizza il tipo di simbolo (locale, globale, parametro, funzione o sconosciuto) di ogni simbolo. Questa opzione visualizza anche le dimensioni di ogni simbolo. Le dimensioni di un simbolo di funzione sono le dimensioni della funzione in memoria. La dimensione di altri simboli è la dimensione del tipo di dati rappresentato dal simbolo. Le dimensioni vengono sempre misurate in byte e visualizzate in formato esadecimale.
/s Size
Visualizza solo i simboli le cui dimensioni, in byte, sono uguali al valore di Size. La dimensione di un simbolo di funzione è la dimensione della funzione in memoria. La dimensione di altri simboli è la dimensione del tipo di dati rappresentato dal simbolo. I simboli la cui dimensione non può essere determinata vengono sempre visualizzati. Le dimensioni devono essere un numero intero diverso da zero.
/q
Visualizza i nomi dei simboli in formato tra virgolette.
/p
Omette lo spazio prima della parentesi di apertura quando il debugger visualizza un nome di funzione e i relativi argomenti. Questo tipo di visualizzazione può semplificare se si copiano nomi di funzione e argomenti dalla visualizzazione x a un'altra posizione.
/f
Visualizza le dimensioni dei dati di una funzione.
/d
Visualizza le dimensioni dei dati.
/a
Ordina la visualizzazione in base all'indirizzo, in ordine crescente.
/Un
Ordina la visualizzazione in base all'indirizzo, in ordine decrescente.
/n
Ordina la visualizzazione in base al nome, in ordine crescente.
/N
Ordina la visualizzazione in base al nome, in ordine decrescente.
/z
Ordina la visualizzazione in base alle dimensioni, in ordine crescente.
/Z
Ordina la visualizzazione in base alle dimensioni, in ordine decrescente.
Modulo
Specifica il modulo da cercare. Questo modulo può essere un file .exe, .dll o .sys. Il modulo può contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni sulla sintassi, vedere Sintassi stringhe con caratteri jolly.
Simbolo
Specifica un criterio che il simbolo deve contenere. Il simbolo può contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni sulla sintassi, vedere Sintassi stringhe con caratteri jolly.
Poiché questo criterio viene confrontato con un simbolo, la corrispondenza non fa distinzione tra maiuscole e minuscole e un singolo carattere di sottolineatura iniziale (_) rappresenta qualsiasi quantità di caratteri di sottolineatura iniziali. È possibile aggiungere spazi all'interno di Symbol, in modo da poter specificare i nomi dei simboli che contengono spazi (ad esempio "operator new" o "Template<A, B>") senza usare caratteri jolly.
Ambiente
Articolo | Descrizione |
---|---|
Modalità | Modalità utente, modalità kernel |
Target | Live, crash dump |
Piattaforme | Tutte le date |
Osservazioni:
Il comando seguente trova tutti i simboli in MyModule che contengono la stringa "spin".
0:000> x mymodule!*spin*
Il comando seguente individua rapidamente i simboli "DownloadMinor" e "DownloadMajor" in MyModule.
0:000> x mymodule!downloadm??or
È anche possibile visualizzare tutti i simboli in MyModule usando il comando seguente.
0:000> x mymodule!*
I comandi precedenti forzano anche il debugger a ricaricare le informazioni sui simboli da MyModule. Se si desidera ricaricare i simboli nel modulo con una visualizzazione minima, usare il comando seguente.
0:000> x mymodule!*start*
Alcuni simboli contengono sempre la stringa "start". Di conseguenza, il comando precedente visualizza sempre un output per verificare che il comando funzioni. Ma il comando precedente evita la lunghezza eccessiva di visualizzazione di x mymodule!*.
La visualizzazione mostra l'indirizzo iniziale di ogni simbolo e il nome completo del simbolo. Se il simbolo è un nome di funzione, la visualizzazione include anche un elenco dei relativi tipi di argomento. Se il simbolo è una variabile globale, viene visualizzato il relativo valore corrente.
C'è un altro caso speciale del comando x . Per visualizzare gli indirizzi e i nomi di tutte le variabili locali per il contesto corrente, usare il comando seguente.
0:000> x *
Nota Nella maggior parte dei casi, non è possibile accedere alle variabili locali a meno che non siano stati caricati simboli privati. Per altre informazioni su questa situazione, vedere dbgerr005: Simboli privati obbligatori. Per visualizzare i valori delle variabili locali, usare il comando dv (Display Local Variables).
Nell'esempio seguente vengono illustrate le opzioni /0, /1 e /2 .
0:000:x86> x /0 MyApp!Add*
00b51410
00b513d0
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers
0:000:x86> x /2 MyApp!Add*
00b51410 MyApp!AddThreeIntegers
00b513d0 MyApp!AddTwoIntegers
Le opzioni /0, /1 e /2 sono utili se si vuole usare l'output del comando x come input per il comando foreach .
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
L'esempio seguente illustra l'opzione /f quando viene usata per filtrare le funzioni nel modulo notepad.exe.
0:000> x /f /v notepad!*main*
prv func 00000001`00003340 249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func 00000001`0000a7b0 1c notepad!WinMainCRTStartup$filt$0 (void)
prv func 00000001`0000a540 268 notepad!WinMainCRTStartup (void)
Quando si usa l'opzione /v , la prima colonna della visualizzazione mostra il tipo di simbolo (locale, globale, parametro, funzione o sconosciuto). La seconda colonna è l'indirizzo del simbolo. La terza colonna è la dimensione del simbolo, in byte. La quarta colonna mostra il nome del modulo e il nome del simbolo. In alcuni casi, questa visualizzazione è seguita da un segno di uguale (=) e quindi dal tipo di dati del simbolo. Viene visualizzata anche l'origine del simbolo (informazioni sul simbolo pubblico o completo).
kd> x /v nt!CmType*
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68 150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0 0 nt!CmTypeString = unsigned short *[]
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Nell'esempio precedente, le dimensioni sono specificate in formato esadecimale, mentre il tipo di dati viene specificato in formato decimale. Pertanto, nell'ultima riga dell'esempio precedente, il tipo di dati è una matrice di 42 puntatori a interi brevi senza segno. La dimensione di questa matrice è 42*4 = 168 e 168 viene visualizzata in formato esadecimale come 0xA8.
È possibile utilizzare l'opzione /sSize per visualizzare solo i simboli le cui dimensioni, in byte, sono un determinato valore. Ad esempio, è possibile limitare il comando nell'esempio precedente ai simboli che rappresentano oggetti la cui dimensione è 0xA8.
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Uso dei tipi di dati
L'opzione /t fa sì che il debugger visualizzi informazioni sul tipo di dati di ogni simbolo. Si noti che per molti simboli, queste informazioni vengono visualizzate anche senza l'opzione /t . Quando si usa /t, tali simboli hanno le informazioni sul tipo di dati visualizzate due volte.
0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>
0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>
Il comando x visualizzerà un'istanza di un tipo.
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
Il comando x non visualizza nulla in base solo al nome di un tipo.
0:001> x foo!MyClass
0:001>
Per visualizzare le informazioni sul tipo usando il nome di un tipo, è consigliabile usare dt (tipo di visualizzazione) e fornisce informazioni sia per i tipi che per le istanze dei tipi:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
Uso dei modelli
È possibile usare caratteri jolly con il comando x per visualizzare le classi modello, come illustrato in questo esempio.
0:001> x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)
È consigliabile usare il comando dt (Tipo di visualizzazione) quando si usano i modelli, perché il comando x non visualizza singoli elementi della classe modello.
0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
+0x000 __VFN_table : Ptr64
+0x008 componentConfig_ : Ptr64 Common::ComponentConfig
+0x010 section_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
+0x038 key_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >