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

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

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

Parâmetros

Expressão

Uma expressão C++ a ser exibida.

-g

Exiba como objetos de grade de dados que são 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 estruturas, onde cada elemento de matriz é exibido em uma linha, e cada campo da estrutura é exibido em uma coluna.

A seleção de um nome de coluna (onde há um link DML disponível) fará a classificação por essa coluna. Se já estiver classificada por essa coluna, a ordem de classificação será invertida.

Qualquer objeto que seja iterável terá um item de menu de contexto do tipo "selecionar e segurar" (ou clique com o botão direito do mouse) adicionado via 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 selecioná-lo exibirá o objeto no modo de exibição em grade, em vez do modo de exibição de árvore padrão.

Um (+) exibido por um nome de coluna oferece um comportamento do tipo "selecionar e segurar" (ou clicar com o botão direito do mouse) e um comportamento de seleção.

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

-gc #

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

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

-n Há duas maneiras de renderizar os dados. Usando a visualização do NatVis (o padrão) ou 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 do NatVis.

-v

Exiba informações detalhadas que incluem métodos e outros objetos atípicos.

-r#

Exiba recursivamente os 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 formato hexadecimal
,d Exibir ordinais no formato decimal
,o Exibir ordinais em formato octal
,b Exibir ordinais no formato binário
,en Exibir enumerações somente por nome (sem valor)
c, Exibir como caractere único (não uma cadeia de caracteres)
,s Exibir cadeias de caracteres de 8 bits como ASCII entre aspas
,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 aspas
,! Exibir objetos somente no modo bruto (por exemplo, sem NatVis)
, # Especificar o comprimento do ponteiro/matriz/contêiner como o valor literal # (substituir por numérico)
,[<expressão>] Especificar o comprimento do ponteiro/matriz/contêiner como a expressão <expressão>
,nd Não localize o tipo derivado (runtype) do objeto. Exibir somente valor estático

dx -?

Exiba a ajuda da linha de comando.

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

dx -id

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

Exemplo de uso da linha de comando

O comando .dx settings pode ser usado para exibir informações sobre o objeto Debug Settings. 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 do 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 descer mais na 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 formato 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 a ser classificada.

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

Exibir informações TEB e PEB usando o objeto Environment

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

Para exibir o TEB associado ao thread atual, use esse 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 esse 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 Io.Handles do kernel

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

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

Use a 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

O objeto Io.Handles é um objeto somente do kernel.

Solucionar limitações de arquivo de símbolo com transmissão

Ao exibir informações sobre diversas variáveis de sistema do 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. Tais referências de "endereço de" são tratadas como "nulas *" e podem ser lançadas 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 da variável.

dx (Datatype *)&VariableName

Por exemplo, para um nt! PsIdleProcess que tem um tipo de dados de nt!_EPROCESS, use esse 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 Avaliar 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 SQL (Structured Query Language) 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 Usar o LINQ com os objetos do depurador.

Usar objetos do depurador com NatVis e JavaScript

Para obter informações sobre como usar objetos do depurador com o NatVis, consulte Objetos do depurador nativo no NatVis.

Para obter informações sobre como usar objetos do depurador com JavaScript, consulte Objetos do depurador nativo em extensões JavaScript.

Confira também

Usando LINQ com os objetos do depurador

Objetos nativos do depurador no NatVis

Objetos nativos do depurador em extensões JavaScript