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
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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de