Freigeben über


dx (Display Debugger Object Model Expression)

Derdx-Befehl zeigt einen C++-Ausdruck mithilfe des NatVis-Erweiterungsmodells an. Weitere Informationen zu NatVis finden Sie unter Benutzerdefinierte Ansichten von nativen Objekten erstellen.

dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]

Parameter

Ausdruck

Ein C++-Ausdruck, der angezeigt werden soll.

-g

Als Datenrasterobjekte anzeigen, die iterierbar sind. Jedes iterierte Element ist eine Zeile im Raster, und jedes untergeordnete Element dieser Elemente ist eine Spalte. Auf diese Weise können Sie etwas wie ein Array von Strukturen anzeigen, wobei jedes Arrayelement in einer Zeile angezeigt wird und jedes Feld der Struktur in einer Spalte angezeigt wird.

Wenn Sie einen Spaltennamen auswählen (wobei eine DML-Verknüpfung verfügbar ist) wird nach dieser Spalte sortiert. Wenn die Sortierreihenfolge bereits nach dieser Spalte sortiert ist, wird die Sortierreihenfolge umgekehrt.

Jedes Objekt, das iterierbar ist, enthält ein Auswahl- und Haltebereichselement (oder Sie klicken mit der rechten Maustaste darauf), das über DML namens "Display as Grid" hinzugefügt wird. Wenn Sie ein Objekt im Ausgabefenster auswählen und gedrückt halten (oder mit der rechten Maustaste darauf klicken), wird das Objekt in der Rasteransicht anstelle der Standardstrukturansicht angezeigt.

Ein (+), das von einem Spaltennamen angezeigt wird, bietet sowohl einen Auswahl-und-Halte-Wert (oder Sie klicken mit der rechten Maustaste) als auch ein Auswahlverhalten.

  • Wählen Sie diese Spalte aus und explodiert sie in einer eigenen Tabelle. Die ursprünglichen Zeilen sowie die untergeordneten Elemente der erweiterten Spalte werden angezeigt.
  • Auswählen und Halten (oder mit der rechten Maustaste klicken) stellt "In Raster erweitern (Expand Into Grid)" bereit, das die Spalte einnimmt und sie wieder zur aktuellen Tabelle als die meisten Spalten hinzufügt.

-gc #

Als Raster anzeigen und Rasterzellengrößen auf die angegebene Anzahl von (#)-Zeichen beschränken.

-c # Zeigt die Containerfortsetzung an (überspringen von # Elementen des Containers). Diese Option wird in der Regel in benutzerdefinierten Ausgabeautomatisierungsszenarien verwendet und bietet ein "..." Fortsetzungselement unten im Eintrag.

-n Es gibt zwei Möglichkeiten, wie Daten gerendert werden können. Verwenden der NatVis-Visualisierung (Standard) oder Verwenden der zugrunde liegenden systemeigenen C/C++-Strukturen. Geben Sie den Parameter -n an, um die Ausgabe mit nur den systemeigenen C/C++-Strukturen und nicht den NatVis-Visualisierungen zu rendern.

-v

Zeigen Sie ausführliche Informationen an, die Methoden und andere nicht typische Objekte enthalten.

-r#

Rekursives Anzeigen von Untertypen (Feldern) bis zu # Ebenen. Wenn # nicht angegeben ist, ist eine Rekursionsebene von 1 der Standardwert.

[<,FormatSpecifier>]

Verwenden Sie einen der folgenden Formatbezeichner, um das Standardrendering zu ändern.

Formatbezeichner Beschreibung
,x Anzeigen von Ordnungszahlen in hexadezimaler Zahl
,d Anzeigen von Ordnungszahlen im Dezimalzeichen
,o Anzeigen von Ordnungszahlen im Oktal
,b Anzeigen von Ordnungszahlen in binärer Version
,en Anzeigen von Enumerationen nur nach Namen (kein Wert)
,c Als einzelnes Zeichen anzeigen (keine Zeichenfolge)
,s Anzeigen von 8-Bit-Zeichenfolgen als ASCII-Anzeichen
,sb 8-Bit-Zeichenfolgen als ASCII ohne Anführungszeichen anzeigen
,s8 Anzeigen von 8-Bit-Zeichenfolgen als UTF-8-Zitat
,s8b 8-Bit-Zeichenfolgen als UTF-8 ohne Anführungszeichen anzeigen
,su Anzeigen von 16-Bit-Zeichenfolgen als UTF-16-Zitat
,sub 16-Bit-Zeichenfolgen als UTF-16 ohne Anführungszeichen anzeigen
,! Nur Objekte im unformatierten Modus anzeigen (z. B. kein NatVis)
, # Angeben der Länge des Zeigers/Arrays/Containers als Literalwert # (ersetzen durch numerische Werte)
,[<Ausdruck>] Geben Sie die Länge des Zeigers/Arrays/Containers als Ausdruck <-Ausruck> an
,nd Suchen Sie den abgeleiteten (Runtyp) des Objekts nicht. Nur statischer Wert anzeigen

dx -?

Befehlszeilenhilfe anzeigen.

dx -h Zeigt hilfe für Objekte an, die im Debugger verfügbar sind.

dx -id

Nur für die interne Verwendung durch Microsoft vorgesehen. Wird verwendet, um Datenmodelllinks in der Befehlsausgabe zu folgen.

Beispiel für die Verwendung der Befehlszeile

Der Befehl ".dx settings" kann verwendet werden, um Informationen zum Debugeinstellungsobjekt anzuzeigen. Weitere Informationen zu den Debugeinstellungsobjekten finden Sie unter .settings.

kd> dx -r1 Debugger.Settings
Debugger.Settings  
    Debug            
    Display           
    EngineInitialization 
    Extensions       
    Input             
    Sources           
    Symbols           
    AutoSaveSettings : false

Verwenden Sie die Option -r1-Rekursion, um die anderen Debuggerobjekte – Sitzungen, Einstellungen und Zustand – anzuzeigen.

kd> dx -r1 Debugger
Debugger  
  Sessions  
  Settings 
  State    
  Utility
  LastEvent 

Geben Sie das Debugger.Sessions-Objekt mit der Option -r3-Rekursion an, um weiter nach unten in der Objektkette zu reisen.

kd> dx -r3 Debugger.Sessions
Debugger.Sessions  
  [0]              : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
    Processes  
      [0]              : <Unknown Image>
      [4]              : <Unknown Image>
      [304]            : smss.exe
      [388]            : csrss.exe
      [456]            : wininit.exe
      [468]            : csrss.exe
      [528]            : services.exe
      [536]            : lsass.exe
      [544]            : winlogon.exe
      [620]            : svchost.exe
       ...               ...

Fügen Sie den X-Formatbezeichner hinzu, um die Ordinalwerte im Hexadezimalwert anzuzeigen.

kd> dx -r3 Debugger.Sessions,x
Debugger.Sessions,x  
  [0x0]            : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
    Processes  
      [0x0]            : <Unknown Image>
      [0x4]            : <Unknown Image>
      [0x130]          : smss.exe
      [0x184]          : csrss.exe
      [0x1c8]          : wininit.exe
      [0x1d4]          : csrss.exe
      [0x210]          : services.exe
      [0x218]          : lsass.exe
      [0x220]          : winlogon.exe
      [0x26c]          : svchost.exe
      [0x298]          : svchost.exe
      [0x308]          : dwm.exe
      [0x34c]          : nvvsvc.exe
      [0x37c]          : nvvsvc.exe
      [0x384]          : svchost.exe
       ...               ...

In diesem Beispiel wird eine aktive Debugsitzung verwendet, um den Aufrufstapel des ersten Threads im ersten Prozess auflisten zu können.

kd> dx -r1 Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames 
    [0x0]            : nt!RtlpBreakWithStatusInstruction
    [0x1]            : nt!KdCheckForDebugBreak + 0x7a006
    [0x2]            : nt!KiUpdateRunTime + 0x42
    [0x3]            : nt!KiUpdateTime + 0x129
    [0x4]            : nt!KeClockInterruptNotify + 0x1c3
    [0x5]            : hal!HalpTimerClockInterruptEpilogCommon + 0xa
    [0x6]            : hal!HalpTimerClockInterruptCommon + 0x3e
    [0x7]            : hal!HalpTimerClockInterrupt + 0x1cb
    [0x8]            : nt!KiIdleLoop + 0x1a

Verwenden Sie die Option "-g", um die Ausgabe als Datenraster anzuzeigen. Wählen Sie die zu sortierende Spalte aus.

kd> dx -g @$curprocess.Modules

Screenshot der Ausgabe des Befehls

Verwenden Sie die Option -h, um Informationen zu Objekten anzuzeigen.

kd>  dx -h Debugger.State
Debugger.State   [State pertaining to the current execution of the debugger (e.g.: user variables)]
    DebuggerVariables [Debugger variables which are owned by the debugger and can be referenced by a pseudo-register prefix of @$]
    PseudoRegisters   [Categorized debugger managed pseudo-registers which can be referenced by a pseudo-register prefix of @$]
    UserVariables     [User variables which are maintained by the debugger and can be referenced by a pseudo-register prefix of @$]

Anzeigen von TEB- und PEB-Informationen mithilfe des Environment-Objekts

Verwenden Sie das Environment-Objekt, um TEB- und PEB-Informationen anzuzeigen, die dem Thread und Prozess zugeordnet sind.

Verwenden Sie diesen Befehl, um den dem aktuellen Thread zugeordneten TEB anzuzeigen.

0: kd> dx -r2 @$curthread.Environment
@$curthread.Environment                
    EnvironmentBlock [Type: _TEB]
        [+0x000] NtTib            [Type: _NT_TIB]
        [+0x038] EnvironmentPointer : Unable to read memory at Address 0x38
        [+0x040] ClientId         [Type: _CLIENT_ID]
        [+0x050] ActiveRpcHandle  : Unable to read memory at Address 0x50
        [+0x058] ThreadLocalStoragePointer : Unable to read memory at Address 0x58
        [+0x060] ProcessEnvironmentBlock : Unable to read memory at Address 0x60
        [+0x068] LastErrorValue   : Unable to read memory at Address 0x68
        [+0x06c] CountOfOwnedCriticalSections : Unable to read memory at Address 0x6c
        [+0x070] CsrClientThread  : Unable to read memory at Address 0x70
        [+0x078] Win32ThreadInfo  : Unable to read memory at Address 0x78
        [+0x080] User32Reserved   [Type: unsigned long [26]]
        [+0x0e8] UserReserved     [Type: unsigned long [5]]
        [+0x100] WOW32Reserved    : Unable to read memory at Address 0x100
        [+0x108] CurrentLocale    : Unable to read memory at Address 0x108
        [+0x10c] FpSoftwareStatusRegister : Unable to read memory at Address 0x10c
         ...

Verwenden Sie diesen Befehl, um PEB anzuzeigen, der dem aktuellen Prozess zugeordnet ist.

0: kd> dx -r2 @$curprocess.Environment
@$curprocess.Environment                
    EnvironmentBlock [Type: _PEB]
        [+0x000] InheritedAddressSpace : Unable to read memory at Address 0x0
        [+0x001] ReadImageFileExecOptions : Unable to read memory at Address 0x1
        [+0x002] BeingDebugged    : Unable to read memory at Address 0x2
        [+0x003] BitField         : Unable to read memory at Address 0x3
        [+0x003 ( 0: 0)] ImageUsesLargePages : Unable to read memory at Address 0x3
        [+0x003 ( 1: 1)] IsProtectedProcess : Unable to read memory at Address 0x3
        [+0x003 ( 2: 2)] IsImageDynamicallyRelocated : Unable to read memory at Address 0x3
        [+0x003 ( 3: 3)] SkipPatchingUser32Forwarders : Unable to read memory at Address 0x3
        [+0x003 ( 4: 4)] IsPackagedProcess : Unable to read memory at Address 0x3
        [+0x003 ( 5: 5)] IsAppContainer   : Unable to read memory at Address 0x3
        [+0x003 ( 6: 6)] IsProtectedProcessLight : Unable to read memory at Address 0x3
        [+0x003 ( 7: 7)] IsLongPathAwareProcess : Unable to read memory at Address 0x3
        [+0x004] Padding0         [Type: unsigned char [4]]
        [+0x008] Mutant           : Unable to read memory at Address 0x8
        [+0x010] ImageBaseAddress : Unable to read memory at Address 0x10
        [+0x018] Ldr              : Unable to read memory at Address 0x18
        [+0x020] ProcessParameters : Unable to read memory at Address 0x20
        ...

Kernel Io.Handles-Objekt

Verwenden Sie das aktuelle Prozessobjekt "Io.Handles", um Kernelhandleinformationen anzuzeigen.

0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles                
    [0x8]           
    [0xc]           
    [0x10]          
    [0x14]          
    [0x18]       
    ...

Verwenden Sie die Funktion .First(), um Informationen zum ersten Handle anzuzeigen.

0: kd> dx -r2 @$curprocess.Io.Handles.First()
@$curprocess.Io.Handles.First()                
    Handle           : 0x8
    Type             : Unexpected failure to dereference object
    GrantedAccess    : Unexpected failure to dereference object
    Object           [Type: _OBJECT_HEADER]
        [+0x000] PointerCount     : 228806 [Type: __int64]
        [+0x008] HandleCount      : 6 [Type: __int64]
        [+0x008] NextToFree       : 0x6 [Type: void *]
        [+0x010] Lock             [Type: _EX_PUSH_LOCK]
        [+0x018] TypeIndex        : 0xf2 [Type: unsigned char]
        [+0x019] TraceFlags       : 0x0 [Type: unsigned char]
        [+0x019 ( 0: 0)] DbgRefTrace      : 0x0 [Type: unsigned char]
        [+0x019 ( 1: 1)] DbgTracePermanent : 0x0 [Type: unsigned char]
        [+0x01a] InfoMask         : 0x0 [Type: unsigned char]
        [+0x01b] Flags            : 0x2 [Type: unsigned char]
        [+0x01b ( 0: 0)] NewObject        : 0x0 [Type: unsigned char]
        [+0x01b ( 1: 1)] KernelObject     : 0x1 [Type: unsigned char]
        [+0x01b ( 2: 2)] KernelOnlyAccess : 0x0 [Type: unsigned char]
        [+0x01b ( 3: 3)] ExclusiveObject  : 0x0 [Type: unsigned char]
        [+0x01b ( 4: 4)] PermanentObject  : 0x0 [Type: unsigned char]
        [+0x01b ( 5: 5)] DefaultSecurityQuota : 0x0 [Type: unsigned char]
        [+0x01b ( 6: 6)] SingleHandleEntry : 0x0 [Type: unsigned char]
        [+0x01b ( 7: 7)] DeletedInline    : 0x0 [Type: unsigned char]
        [+0x01c] Reserved         : 0x0 [Type: unsigned long]
        [+0x020] ObjectCreateInfo : 0xfffff801f6d9c6c0 [Type: _OBJECT_CREATE_INFORMATION *]
        [+0x020] QuotaBlockCharged : 0xfffff801f6d9c6c0 [Type: void *]
        [+0x028] SecurityDescriptor : 0xffffb984aa815d06 [Type: void *]
        [+0x030] Body             [Type: _QUAD]
        ObjectType       : Unexpected failure to dereference object
        UnderlyingObject : Unexpected failure to dereference object

Beachten Sie, dass das Io.Handles-Objekt ein einziges Kernelobjekt ist.

Umgehen von Symboldateibeschränkungen bei Umwandlung

Beim Anzeigen von Informationen zu verschiedenen Windows-Systemvariablen gibt es Zeiten, in denen nicht alle Typinformationen in den öffentlichen Symbolen verfügbar sind. Das folgende Beispiel veranschaulicht diese Situation.

0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128

Der dx-Befehl unterstützt die Möglichkeit, auf die Adresse einer Variablen zu verweisen, die keine Typinformationen enthält. Solche „Adresse von“-Referenzen werden als „void *“ behandelt und können als solche umgewandelt werden. Dies bedeutet, dass die folgende Syntax verwendet werden kann, wenn der Datentyp bekannt ist, um Typinformationen für die Variable anzuzeigen.

dx (Datatype *)&VariableName

Zum Beispiel für ein nt!PsIdleProcess mit dem Datentyp nt!_EPROCESS verwenden Sie diesen Befehl.

dx (nt!_EPROCESS *)&nt!PsIdleProcess
(nt!_EPROCESS *)&nt!PsIdleProcess                 : 0xfffff800e1d50128 [Type: _EPROCESS *]
    [+0x000] Pcb              [Type: _KPROCESS]
    [+0x2c8] ProcessLock      [Type: _EX_PUSH_LOCK]
    [+0x2d0] CreateTime       : {4160749568} [Type: _LARGE_INTEGER]
    [+0x2d8] RundownProtect   [Type: _EX_RUNDOWN_REF]
    [+0x2e0] UniqueProcessId  : 0x1000 [Type: void *]
    [+0x2e8] ActiveProcessLinks [Type: _LIST_ENTRY]
    [+0x2f8] Flags2           : 0x218230 [Type: unsigned long]
    [+0x2f8 ( 0: 0)] JobNotReallyActive : 0x0 [Type: unsigned long]

Der dx-Befehl unterstützt das Wechseln von Ausdrucksauswertern mit der @@ MASM-Syntax nicht. Weitere Informationen zu Ausdrucksauswertungen finden Sie unter Auswerten von Ausdrücken.

Verwendung von LINQ mit den Debugger-Objekten

LINQ-Syntax kann mit den Debuggerobjekten verwendet werden, um Daten zu durchsuchen und zu bearbeiten. LINQ ist konzeptuell mit dem strukturierte Abfragesprache (SQL) vergleichbar, das zum Abfragen von Datenbanken verwendet wird. Sie können eine Reihe von LINQ-Methoden verwenden, um Debugdaten zu durchsuchen, zu filtern und zu analysieren. Informationen zur Verwendung von LINQ mit den Debuggerobjekten finden Sie unter Verwenden von LINQ mit den Debuggerobjekten.

Verwenden von Debuggerobjekten mit NatVis und JavaScript

Informationen zur Verwendung von Debuggerobjekten mit NatVis finden Sie unter Native Debuggerobjekte in NatVis.

Informationen zur Verwendung von Debuggerobjekten mit JavaScript finden Sie unter Native Debuggerobjekte in JavaScript-Erweiterungen.

Weitere Informationen

Verwendung von LINQ mit den Debugger-Objekten

Native Debugger-Objekte in NatVis

Native Debugger-Objekte in JavaScript-Erweiterungen