Condividi tramite


dx (Display Debugger Object Model Expression)

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

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

Parametri

Expression

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 visualizzato di tali elementi è una colonna. In questo modo è possibile visualizzare un elemento come 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.

Se si seleziona 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 iterabile avrà una voce di menu di scelta rapida (o clic con il pulsante destro del mouse) aggiunta tramite DML denominata "Display as Grid". 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 albero standard.

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

  • Selezionare accetta tale colonna ed esploderla 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.

-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 pari a uno è il valore predefinito.

[<,FormatSpecifier>]

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

Identificatore di formato Descrizione
X Visualizzare ordinali in formato esadecimale
D Visualizzare ordinali in decimale
,o Visualizza ordinali in ottale
B Visualizzare ordinali in formato binario
En Visualizza solo enumerazioni 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 senza virgolette ASCII
,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)
,[<expression>] 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 dei comandi.

Esempio di utilizzo della riga di comando

Il comando .dx settings può essere usato per visualizzare informazioni sull'oggetto Debug Impostazioni. 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 di ricorsione -r1 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 più in 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 utilizzata 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 mostra 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   [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 @$]

Visualizzazione di informazioni TEB e PEB tramite l'oggetto Environment

Utilizzare l'oggetto Environment per visualizzare le informazioni TEB 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

Usare 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 è solo un oggetto kernel.

Uso delle limitazioni dei file di simboli con il cast

Quando vengono visualizzate informazioni sulle 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 "indirizzo di" 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 un 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 linguaggio SQL (Structured Query Language) 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