x (Symbole überprüfen)
Der Befehl "x " zeigt die Symbole in allen Kontexten an, die dem angegebenen Muster entsprechen.
x [Options] Module!Symbol
x [Options] *
Parameter
Options Specifies symbol searching options. Sie können eine oder mehrere der folgenden Optionen verwenden:
/0
Zeigt nur die Adresse jedes Symbols an.
/1
Zeigt nur den Namen der einzelnen Symbole an.
/2
Zeigt nur die Adresse und den Namen jedes Symbols an (nicht den Datentyp).
/D
Zeigt die Ausgabe mithilfe der Debuggermarkupsprache an.
/t
Zeigt den Datentyp jedes Symbols an, wenn der Datentyp bekannt ist.
/v
Zeigt den Symboltyp (lokal, global, Parameter, Funktion oder unbekannt) jedes Symbols an. Mit dieser Option wird auch die Größe jedes Symbols angezeigt. Die Größe eines Funktionssymbols ist die Größe der Funktion im Arbeitsspeicher. Die Größe anderer Symbole ist die Größe des Datentyps, den das Symbol darstellt. Die Größe wird immer in Bytes gemessen und im Hexadezimalformat angezeigt.
/s Größe
Zeigt nur die Symbole an, deren Größe in Byte dem Wert der Größe entspricht. Die Größe eines Funktionssymbols ist die Größe der Funktion im Arbeitsspeicher. Die Größe anderer Symbole ist die Größe des Datentyps, den das Symbol darstellt. Symbole, deren Größe nicht bestimmt werden kann, werden immer angezeigt. Die Größe muss eine ganze Zahl ungleich Null sein.
/q
Zeigt Symbolnamen im Anführungszeichenformat an.
/p
Lässt das Leerzeichen vor der öffnenden Klammer aus, wenn der Debugger einen Funktionsnamen und dessen Argumente anzeigt. Diese Art von Anzeige kann es einfacher machen, wenn Sie Funktionsnamen und Argumente aus der x-Anzeige an eine andere Position kopieren.
/f
Zeigt die Datengröße einer Funktion an.
/d
Zeigt die Datengröße an.
/a
Sortiert die Anzeige nach Adresse in aufsteigender Reihenfolge.
/Ein
Sortiert die Anzeige nach Adresse in absteigender Reihenfolge.
/n
Sortiert die Anzeige nach Namen in aufsteigender Reihenfolge.
/N
Sortiert die Anzeige nach Name in absteigender Reihenfolge.
/z
Sortiert die Anzeige nach Größe in aufsteigender Reihenfolge.
/Z
Sortiert die Anzeige nach Größe in absteigender Reihenfolge.
Modul
Gibt das zu durchsuchende Modul an. Dieses Modul kann eine .exe-, .dll- oder .sys datei sein. Das Modul kann eine Vielzahl von Platzhalterzeichen und Spezifizierern enthalten. Weitere Informationen über die Syntax finden Sie unter String Wildcard Syntax.
Symbol
Gibt ein Muster an, das das Symbol enthalten muss. Symbol kann eine Vielzahl von Wildcardzeichen und Bezeichnern enthalten. Weitere Informationen über die Syntax finden Sie unter String Wildcard Syntax.
Da dieses Muster mit einem Symbol abgeglichen wird, wird die Groß-/Kleinschreibung nicht beachtet, und ein einzelner führender Unterstrich (_) stellt eine beliebige Menge von führenden Unterstrichen dar. Sie können Leerzeichen innerhalb von Symbol hinzufügen, sodass Sie Symbolnamen angeben können, die Leerzeichen enthalten (z. B. "Operator neu" oder "Vorlage<A, B>"), ohne Platzhalterzeichen zu verwenden.
Environment
Element | Beschreibung |
---|---|
Modi | Benutzermodus, Kernel-Modus |
Ziele | Live, Crash Dump |
Plattformen | Alle |
Hinweise
Der folgende Befehl findet alle Symbole in MyModule, die die Zeichenfolge "spin" enthalten.
0:000> x mymodule!*spin*
Mit dem folgenden Befehl werden schnell die Symbole "DownloadMinor" und "DownloadMajor" in MyModule gefunden.
0:000> x mymodule!downloadm??or
Sie können auch alle Symbole in MyModule anzeigen, indem Sie den folgenden Befehl verwenden.
0:000> x mymodule!*
Die vorherigen Befehle erzwingen außerdem, dass der Debugger Symbolinformationen von MyModule neu laden kann. Wenn Sie die Symbole im Modul mit einer minimalen Anzeige neu laden möchten, verwenden Sie den folgenden Befehl.
0:000> x mymodule!*start*
Einige Symbole enthalten immer die Zeichenfolge "start". Daher zeigt der vorherige Befehl immer eine Ausgabe an, um zu überprüfen, ob der Befehl funktioniert. Der vorstehende Befehl vermeidet jedoch die übermäßige Anzeigelänge von x mymodule!*.
Die Anzeige zeigt die Startadresse jedes Symbols und den vollständigen Symbolnamen an. Wenn es sich bei dem Symbol um einen Funktionsnamen handelt, enthält die Anzeige auch eine Liste der Argumenttypen. Wenn es sich bei dem Symbol um eine globale Variable handelt, wird der aktuelle Wert angezeigt.
Es gibt einen anderen Sonderfall des x-Befehls . Verwenden Sie den folgenden Befehl, um die Adressen und Namen aller lokalen Variablen für den aktuellen Kontext anzuzeigen.
0:000> x *
Hinweis In den meisten Fällen können Sie nicht auf lokale Variablen zugreifen, es sei denn, private Symbole wurden geladen. Weitere Informationen zu dieser Situation finden Sie unter dbgerr005: Private Symbole erforderlich. Verwenden Sie den Befehl dv (Lokale Variablen anzeigen), um die Werte lokaler Variablen anzuzeigen.
Das folgende Beispiel veranschaulicht die Optionen "/0", "/1" und "/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
Die Optionen "/0", "/1" und "/2 " sind nützlich, wenn Sie die Ausgabe des x-Befehls als Eingabe für den Befehl ".foreach " verwenden möchten.
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
Im folgenden Beispiel wird der Schalter /f veranschaulicht, wenn er zum Filtern von Funktionen auf dem Modul notepad.exe verwendet wird.
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)
Wenn Sie die Option /v verwenden, wird in der ersten Spalte der Anzeige der Symboltyp (lokal, global, Parameter, Funktion oder unbekannt) angezeigt. Die zweite Spalte ist die Adresse des Symbols. Die dritte Spalte ist die Größe des Symbols in Byte. In der vierten Spalte werden der Modulname und der Symbolname angezeigt. In einigen Fällen folgt auf diese Anzeige ein Gleichheitszeichen (=) und dann der Datentyp des Symbols. Die Quelle des Symbols (öffentliche oder vollständige Symbolinformationen) wird ebenfalls angezeigt.
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]
Im vorherigen Beispiel wird die Größe im Hexadezimalformat angegeben, während der Datentyp im Dezimalformat angegeben wird. Daher ist der Datentyp in der letzten Zeile des vorherigen Beispiels ein Array von 42 Zeigern zu nicht signierten kurzen Ganzzahlen. Die Größe dieses Arrays beträgt 42*4 = 168, und 168 wird als 0xA8 im Hexadezimalformat angezeigt.
Sie können die Option "/sGröße " verwenden, um nur die Symbole anzuzeigen, deren Größe in Bytes ein bestimmter Wert ist. Sie können beispielsweise den Befehl im vorherigen Beispiel auf Symbole beschränken, die Objekte darstellen, deren Größe 0xA8 ist.
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Arbeiten mit Datentypen
Die Option "/t " bewirkt, dass der Debugger Informationen zum Datentyp jedes Symbols anzeigt. Beachten Sie, dass bei vielen Symbolen diese Informationen auch ohne die Option "/t " angezeigt werden. Wenn Sie /t verwenden, werden die Datentypinformationen dieser Symbole zweimal angezeigt.
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>
Der Befehl "x" zeigt eine Instanz eines Typs an.
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
Der Befehl "x" zeigt nichts basierend auf dem Namen eines Typs an.
0:001> x foo!MyClass
0:001>
Wenn Sie Typinformationen mithilfe des Namens eines Typs anzeigen möchten, sollten Sie dt (Anzeigetyp) verwenden, sie stellt Informationen für Typen und Instanzen von Typen bereit:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
Arbeiten mit Vorlagen
Sie können Wildcards mit dem Befehl "x" verwenden, um Vorlagenklassen anzuzeigen, wie in diesem Beispiel gezeigt.
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)
Erwägen Sie die Verwendung des Befehls dt (Anzeigetyp) beim Arbeiten mit Vorlagen, da der Befehl "x" keine einzelnen Vorlagenklassenelemente anzeigt.
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> >