dx (exibir expressão de modelo de objeto do depurador)

O comando dx exibe uma expressão C++ usando o modelo de extensão NatVis. Para obter mais informações sobre NatVis, consulte Criar exibições personalizadas de objetos nativos.

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

Parâmetros

Expression

Uma expressão C++ a ser exibida.

-g

Exibir como objetos de grade de dados que podem ser iteráveis. Cada elemento iterado é uma linha na grade e cada filho de exibição desses elementos é uma coluna. Isso permite que você exiba algo como uma matriz de structs, em que cada elemento de matriz é exibido em uma linha e cada campo do struct é exibido em uma coluna.

Selecionar um nome de coluna (em que há um link DML disponível) classificará por essa coluna. Se já estiver classificado por essa coluna, a ordem de classificação será invertida.

Qualquer objeto iterável terá um item de menu de contexto selecionar e segurar (ou clicar com o botão direito do mouse) adicionado por meio de DML chamado "Exibir como Grade". Selecionar e segurar (ou clicar com o botão direito do mouse) um objeto na janela de saída e selecionar isso exibirá o objeto no modo de exibição de grade em vez do modo de exibição de árvore padrão.

Um (+) exibido por um nome de coluna oferece um select-and-hold (ou clique com o botão direito do mouse) e um comportamento de seleção.

  • Selecione pega essa coluna e a explode em sua própria tabela. Você verá as linhas originais mais os filhos da coluna expandida.
  • Selecionar e segurar (ou clicar com o botão direito do mouse) fornece "Expandir em Grade", que usa a coluna e a adiciona de volta à tabela atual como a maioria das colunas à direita.

-Gc #

Exiba como uma grade e restrinja os tamanhos de célula de grade ao número especificado de caracteres (#).

-c # Exibe a continuação do contêiner (ignorando nº de elementos do contêiner). Essa opção normalmente é usada em cenários de automação de saída personalizados e fornece um "..." elemento continuation na parte inferior da listagem.

-N Há duas maneiras pelas quais os dados podem ser renderizados. Usando a visualização natvis (o padrão) ou usando as estruturas C/C++ nativas subjacentes. Especifique o parâmetro -n para renderizar a saída usando apenas as estruturas C/C++ nativas e não as visualizações de NatVis.

-v

Exiba informações detalhadas que incluem métodos e outros objetos não típicos.

-R#

Exibe recursivamente subtipos (campos) até # níveis. Se # não for especificado, um nível de recursão de um será o valor padrão.

[<,FormatSpecifier>]

Use qualquer um dos especificadores de formato a seguir para modificar a renderização padrão.

Especificador de formato Descrição
X Exibir ordinais em hexidecimal
D Exibir ordinais em decimal
,o Exibir ordinais em octal
B Exibir ordinais em binário
En Exibir enumerações apenas por nome (sem valor)
C Exibir como caractere único (não uma cadeia de caracteres)
,s Exibir cadeias de caracteres de 8 bits como aspas ASCII
Sb Exibir cadeias de caracteres de 8 bits como ASCII sem aspas
,s8 Exibir cadeias de caracteres de 8 bits como UTF-8 entre aspas
,s8b Exibir cadeias de caracteres de 8 bits como UTF-8 sem aspas
Su Exibir cadeias de caracteres de 16 bits como UTF-16 entre aspas
Sub Exibir cadeias de caracteres de 16 bits como UTF-16 sem perguntas frequentes
,! Exibir objetos somente no modo bruto (por exemplo, sem NatVis)
,# Especifique o comprimento do ponteiro/matriz/contêiner como o valor literal # (substitua por numérico)
,[<expressão>] Especificar o comprimento do ponteiro/matriz/contêiner como a expressão de expressão <>
Nd Não localize o tipo derivado (runtype) do objeto . Exibir apenas o valor estático

dx-?

Exiba a ajuda da linha de comando.

dx-h Exibe ajuda para objetos disponíveis no depurador.

dx-id

Somente uso interno da Microsoft. Usado para seguir links de modelo de dados na saída do comando.

Exemplo de uso de linha de comando

O comando de configurações .dx pode ser usado para exibir informações sobre o objeto Configurações de Depuração. Para obter mais informações sobre os objetos de configurações de depuração, consulte .settings.

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

Use a opção de recursão -r1 para exibir os outros objetos de depurador – Sessões, Configurações e Estado.

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

Especifique o objeto Debugger.Sessions com a opção de recursão -r3 para percorrer mais abaixo a cadeia de objetos.

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

Adicione o especificador de formato x para exibir os valores ordinais em hexadecimal.

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

Este exemplo usa uma sessão de depuração ativa para listar a pilha de chamadas do primeiro thread no primeiro 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

Use a opção -g para exibir a saída como uma grade de dados. Selecione a coluna para classificar.

kd> dx -g @$curprocess.Modules

Captura de tela da saída do comando dx -g @$curprocess.modules, exibindo a saída da grade colunar.

Use a opção -h para exibir informações sobre objetos.

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

Exibindo informações de TEB e PEB usando o objeto Environment

Use o objeto Environment para exibir informações de TEB e PEB associadas ao thread e ao processo.

Para exibir o TEB associado ao thread atual, use este 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
         ...

Para exibir o PEB associado ao processo atual, use este 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
        ...

Objeto Kernel Io.Handles

Use o objeto Io.Handles do processo atual para exibir informações de identificador de kernel.

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

Use o . Função First() para exibir informações sobre o primeiro identificador.

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

Observe que o objeto Io.Handles é um objeto somente kernel.

Trabalhando em torno de limitações de arquivo de símbolo com conversão

Ao exibir informações sobre várias variáveis do sistema Windows, há momentos em que nem todas as informações de tipo estão disponíveis nos símbolos públicos. Este exemplo ilustra essa situação.

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

O comando dx dá suporte à capacidade de referenciar o endereço de uma variável que não tem informações de tipo. Essas referências de "endereço de" são tratadas como "void *" e podem ser convertidas como tal. Isso significa que, se o tipo de dados for conhecido, a sintaxe a seguir poderá ser usada para exibir informações de tipo para a variável.

dx (Datatype *)&VariableName

Por exemplo, para um nt! PsIdleProcess, que tem um tipo de dados nt!_EPROCESS, use este 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]

O comando dx não dá suporte à alternância de avaliadores de expressão com a sintaxe @@ MASM. Para obter mais informações sobre avaliadores de expressão, consulte Avaliando expressões.

Usando LINQ com os objetos do depurador

A sintaxe LINQ pode ser usada com os objetos do depurador para pesquisar e manipular dados. O LINQ é conceitualmente semelhante ao LINGUAGEM SQL (SQL) usado para consultar bancos de dados. Você pode usar vários métodos LINQ para pesquisar, filtrar e analisar dados de depuração. Para obter informações sobre como usar o LINQ com os objetos do depurador, consulte Usando LINQ com os objetos do depurador.

Usando objetos do depurador com NatVis e JavaScript

Para obter informações sobre como usar objetos de depurador com NatVis, consulte Native Debugger Objects in NatVis.

Para obter informações sobre como usar objetos de depurador com JavaScript, consulte Native Debugger Objects in JavaScript Extensions.

Confira também

Usando LINQ com os objetos do depurador

Objetos nativos do depurador no NatVis

Objetos nativos do depurador em extensões JavaScript