dx (Visualizza espressione del modello a oggetti del debugger)

Il comando dx visualizza un'espressione C++ usando il modello di estensione NatVis. Per altre informazioni su NatVis, vedere Creare viste personalizzate di oggetti nativi.

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

Parametri

Espressione

Espressione C++ da visualizzare.

-g

Visualizza come oggetti griglia di dati che sono iterabili. Ogni elemento iterato è una riga nella griglia e ogni elemento figlio di visualizzazione di tali elementi è una colonna. In questo modo è possibile visualizzare una matrice di struct, in cui ogni elemento della matrice viene visualizzato in una riga e ogni campo dello struct viene visualizzato in una colonna.

Selezionando un nome di colonna (in cui è presente un collegamento DML disponibile) verrà ordinato in base a tale colonna. Se è già stato ordinato in base a tale colonna, l'ordinamento verrà invertito.

Qualsiasi oggetto che è iterabile avrà una voce di menu di scelta rapida selezionata o clic con il pulsante destro del mouse aggiunta tramite DML denominato "Visualizza come griglia". Selezionando e tenendo premuto (o facendo clic con il pulsante destro del mouse) un oggetto nella finestra di output e selezionando l'oggetto verrà visualizzato nella visualizzazione griglia anziché nella visualizzazione struttura ad albero standard.

Un oggetto (+) visualizzato da un nome di colonna offre un controllo di selezione e blocco (o clic con il pulsante destro del mouse) e un comportamento di selezione.

  • Selezionare accetta la colonna e la esplode nella propria tabella. Vengono visualizzate le righe originali più gli elementi figlio della colonna espansa.
  • Selezionare e tenere premuto (o fare clic con il pulsante destro del mouse) fornisce "Espandi in griglia" che accetta la colonna e la aggiunge nuovamente alla tabella corrente come la maggior parte delle colonne a destra.

-Gc #

Visualizza come griglia e limita le dimensioni delle celle della griglia al numero specificato di caratteri (#).

-c # Visualizza la continuazione del contenitore (ignorando gli elementi # del contenitore). Questa opzione viene in genere usata negli scenari di automazione dell'output personalizzati e fornisce un "..." elemento di continuazione nella parte inferiore dell'elenco.

-N È possibile eseguire il rendering dei dati in due modi. Uso della visualizzazione NatVis (impostazione predefinita) o dell'uso delle strutture C/C++ native sottostanti. Specificare il parametro -n per eseguire il rendering dell'output usando solo le strutture C/C++ native e non le visualizzazioni NatVis.

-v

Visualizzare informazioni dettagliate che includono metodi e altri oggetti non tipici.

-R#

Visualizza in modo ricorsivo sottotipi (campi) fino a # livelli. Se # non viene specificato, un livello di ricorsione di uno è il valore predefinito.

[<,FormatSpecifier>]

Usare uno degli identificatori di formato seguenti per modificare il rendering predefinito.

Identificatore di formato Descrizione
X Visualizza ordinali in esadecimale
D Visualizzare i numeri ordinali in decimale
,o Visualizza ordinali in ottale
B Visualizzare i ordinali in formato binario
En Visualizza enumerazioni solo per nome (nessun valore)
C Visualizza come carattere singolo (non una stringa)
,s Visualizzare stringhe a 8 bit come virgolette ASCII
Sb Visualizzare stringhe a 8 bit come ASCII senza virgolette
,s8 Visualizzare stringhe a 8 bit come virgolette UTF-8
,s8b Visualizzare stringhe a 8 bit come UTF-8 senza virgolette
,su Visualizzare stringhe a 16 bit come virgolette UTF-16
Sub Visualizzare stringhe a 16 bit come UTF-16 unqouted
,! Visualizzare gli oggetti solo in modalità non elaborata (ad esempio, nessun NatVis)
,# Specificare la lunghezza del puntatore/matrice/contenitore come valore letterale # (sostituire con numerico)
,[<espressione>] Specificare la lunghezza del puntatore/matrice/contenitore come espressione di espressione <>
Nd Non trovare il tipo derivato (runtype) dell'oggetto . Visualizza solo valore statico

dx-?

Visualizzare la Guida della riga di comando.

dx-h Visualizza la Guida per gli oggetti disponibili nel debugger.

dx-id

Solo per uso interno di Microsoft. Usato per seguire i collegamenti del modello di dati nell'output del comando.

Esempio di utilizzo della riga di comando

Il comando .dx settings può essere utilizzato per visualizzare informazioni sull'oggetto Impostazioni di debug. Per altre informazioni sugli oggetti impostazioni di debug, vedere .settings.

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

Usare l'opzione -r1 di ricorsione per visualizzare gli altri oggetti Debugger- Sessioni, Impostazioni e Stato.

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

Specificare l'oggetto Debugger.Sessions con l'opzione di ricorsione -r3 per spostarsi ulteriormente verso il basso nella catena di oggetti.

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
       ...               ...

Aggiungere l'identificatore di formato x per visualizzare i valori ordinali in formato esadecimale.

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 questo esempio viene usata una sessione di debug attiva per elencare lo stack di chiamate del primo thread nel primo processo.

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

Usare l'opzione -g per visualizzare l'output come griglia dati. Selezionare la colonna da ordinare.

kd> dx -g @$curprocess.Modules

Screenshot dell'output del comando dx -g @$curprocess.modules, che visualizza l'output della griglia a colonne.

Usare l'opzione -h per visualizzare informazioni sugli oggetti.

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   [Categorizied 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 @$]

Visualizzazione di informazioni TEB e PEB tramite l'oggetto Environment

Utilizzare l'oggetto Environment per visualizzare le informazioni DIB e PEB associate al thread e al processo.

Per visualizzare il TEB associato al thread corrente, usare questo comando.

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
         ...

Per visualizzare PEB associato al processo corrente, usare questo comando.

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
        ...

Oggetto Io.Handle del kernel

Utilizzare l'oggetto Io.Handle del processo corrente per visualizzare le informazioni sull'handle del kernel.

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

Usare . Funzione First() per visualizzare informazioni sul primo handle.

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

Si noti che l'oggetto Io.Handle è un oggetto solo kernel.

Uso delle limitazioni dei file di simboli con il cast

Quando si visualizzano informazioni su varie variabili di sistema di Windows, in alcuni casi non tutte le informazioni sul tipo sono disponibili nei simboli pubblici. Questo esempio illustra questa situazione.

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

Il comando dx supporta la possibilità di fare riferimento all'indirizzo di una variabile che non dispone di informazioni sul tipo. Tali riferimenti "address of" vengono considerati come "void *" e possono essere sottoposti a cast come tali. Ciò significa che se il tipo di dati è noto, è possibile usare la sintassi seguente per visualizzare le informazioni sul tipo per la variabile.

dx (Datatype *)&VariableName

Ad esempio per un nt! PsIdleProcess con tipo di dati nt!_EPROCESS, usare questo comando.

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]

Il comando dx non supporta il cambio di analizzatori di espressioni con la sintassi @@ MASM. Per altre informazioni sugli analizzatori di espressioni, vedere Valutazione di espressioni.

Uso di LINQ Con gli oggetti debugger

La sintassi LINQ può essere usata con gli oggetti debugger per cercare e modificare i dati. LINQ è concettualmente simile al Structured Query Language (SQL) usato per eseguire query sui database. È possibile usare diversi metodi LINQ per cercare, filtrare e analizzare i dati di debug. Per informazioni sull'uso di LINQ con gli oggetti debugger, vedere Uso di LINQ Con gli oggetti debugger.

Uso di oggetti debugger con NatVis e JavaScript

Per informazioni sull'uso di oggetti debugger con NatVis, vedere Oggetti debugger nativi in NatVis.

Per informazioni sull'uso di oggetti debugger con JavaScript, vedere Oggetti debugger nativi nelle estensioni JavaScript.

Vedi anche

Uso di LINQ Con gli oggetti debugger

Oggetti debugger nativi in NatVis

Oggetti debugger nativi nelle estensioni JavaScript