Partilhar via


x (Examinar símbolos)

O comando x exibe os símbolos em todos os contextos que correspondem ao padrão especificado.

x [Options] Module!Symbol 
x [Options] *

Parâmetros

Opções Especifica as opções de pesquisa de símbolos. Você pode usar uma ou mais das seguintes opções:

/0
Exibe apenas o endereço de cada símbolo.

/1
Exibe apenas o nome de cada símbolo.

/2
Exibe apenas o endereço e o nome de cada símbolo (não o tipo de dados).

/D
Exibe a saída usando a Linguagem de Marcação do Depurador.

/t
Exibe o tipo de dados de cada símbolo, se o tipo de dados for conhecido.

/v
Exibe o tipo de símbolo (local, global, parâmetro, função ou desconhecido) de cada símbolo. Essa opção também exibe o tamanho de cada símbolo. O tamanho de um símbolo de função é o tamanho da função na memória. O tamanho de outros símbolos é o tamanho do tipo de dados que o símbolo representa. O tamanho é sempre medido em bytes e exibido em formato hexadecimal.

/s Tamanho
Exiba apenas os símbolos cujo tamanho, em bytes, é igual ao valor de Tamanho. O tamanho de um símbolo de função é o tamanho da função na memória. O tamanho de outros símbolos é o tamanho do tipo de dados que o símbolo representa. Os símbolos cujo tamanho não pode ser determinado são sempre exibidos. O tamanho deve ser um inteiro diferente de zero.

/q
Exibe nomes de símbolos no formato entre aspas.

/p
Omite o espaço antes do parêntese de abertura quando o depurador exibe um nome de função e seus argumentos. Esse tipo de exibição pode facilitar se você estiver copiando nomes de funções e argumentos da exibição x para outro local.

/f
Exibe o tamanho dos dados de uma função.

/d
Exibe o tamanho dos dados.

/a
Classifica a exibição por endereço, em ordem crescente.

/Um
Classifica a exibição por endereço, em ordem decrescente.

/n
Classifica a exibição por nome, em ordem crescente.

/N
Classifica a exibição por nome, em ordem decrescente.

/z
Classifica a exibição por tamanho, em ordem crescente.

/Z
Classifica a exibição por tamanho, em ordem decrescente.

Módulo
Especifica o módulo a ser pesquisado. Este módulo pode ser um arquivo .exe, .dll ou .sys. Module pode conter diversos caracteres curinga e especificadores. Para obter mais informações sobre a sintaxe, confira Sintaxe do curinga da cadeia de caracteres.

Símbolo
Especifica um padrão que o símbolo deve conter. O símbolo pode conter uma variedade de caracteres curinga e especificadores. Para obter mais informações sobre a sintaxe, confira Sintaxe do curinga da cadeia de caracteres.

Como esse padrão é correspondido a um símbolo, a correspondência não diferencia maiúsculas de minúsculas e um único sublinhado à esquerda (_) representa qualquer quantidade de sublinhados à esquerda. Você pode adicionar espaços dentro de Symbol, para que possa especificar nomes de símbolos que contenham espaços (como "operator new" ou "Template<A, B>") sem usar caracteres curinga.

Ambiente

Item Descrição
Modos Modo de usuário, modo kernel
Destinos Ao vivo, despejo de memória
Plataformas Tudo

Comentários

O comando a seguir localiza todos os símbolos em MyModule que contêm a cadeia de caracteres "spin".

0:000> x mymodule!*spin* 

O comando a seguir localiza rapidamente os símbolos "DownloadMinor" e "DownloadMajor" no MyModule.

0:000> x mymodule!downloadm??or 

Você também pode mostrar todos os símbolos no MyModule usando o comando a seguir.

0:000> x mymodule!* 

Os comandos anteriores também forçam o depurador a recarregar as informações de símbolo de MyModule. Se você quiser recarregar os símbolos no módulo com uma exibição mínima, use o comando a seguir.

0:000> x mymodule!*start* 

Alguns símbolos sempre contêm a string "start". Portanto, o comando anterior sempre exibe alguma saída para verificar se o comando funciona. Mas o comando anterior evita o comprimento excessivo de exibição de x mymodule!*.

O visor mostra o endereço inicial de cada símbolo e o nome completo do símbolo. Se o símbolo for um nome de função, a exibição também incluirá uma lista de seus tipos de argumento. Se o símbolo for uma variável global, seu valor atual será exibido.

Há um outro caso especial do comando x . Para exibir os endereços e nomes de todas as variáveis locais para o contexto atual, use o comando a seguir.

0:000> x * 

Observação Na maioria dos casos, você não pode acessar variáveis locais, a menos que símbolos privados tenham sido carregados. Para obter mais informações sobre essa situação, consulte dbgerr005: Símbolos privados necessários. Para exibir os valores das variáveis locais, use o comando dv (Exibir variáveis locais).

O exemplo a seguir ilustra as opções /0, /1 e /2 .

0:000:x86> x /0 MyApp!Add*
00b51410          
00b513d0 
      
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers

0:000:x86> x /2 MyApp!Add*
00b51410          MyApp!AddThreeIntegers
00b513d0          MyApp!AddTwoIntegers

As opções /0, /1 e /2 são úteis se você quiser usar a saída do comando x como entrada para o comando .foreach .

.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }

O exemplo a seguir demonstra a opção /f quando usada para filtrar funções no módulo notepad.exe.

0:000> x /f /v notepad!*main*
prv func   00000001`00003340  249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func   00000001`0000a7b0   1c notepad!WinMainCRTStartup$filt$0 (void)
prv func   00000001`0000a540  268 notepad!WinMainCRTStartup (void)

Quando você usa a opção /v , a primeira coluna da exibição mostra o tipo de símbolo (local, global, parâmetro, função ou desconhecido). A segunda coluna é o endereço do símbolo. A terceira coluna é o tamanho do símbolo, em bytes. A quarta coluna mostra o nome do módulo e o nome do símbolo. Em alguns casos, essa exibição é seguida por um sinal de igual (=) e, em seguida, o tipo de dados do símbolo. A fonte do símbolo (informações públicas ou completas do símbolo) também é exibida.

kd> x /v nt!CmType*
global 806c9e68    0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68  150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68    0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0    0 nt!CmTypeString = unsigned short *[]
global 805bd7b0   a8 nt!CmTypeString = unsigned short *[42]

No exemplo anterior, o tamanho é fornecido em formato hexadecimal, enquanto o tipo de dados é fornecido em formato decimal. Portanto, na última linha do exemplo anterior, o tipo de dados é uma matriz de 42 ponteiros para inteiros curtos sem sinal. O tamanho dessa matriz é 42*4 = 168 e 168 é exibido em formato hexadecimal como 0xA8.

Você pode usar a opção Tamanho /spara exibir apenas os símbolos cujo tamanho, em bytes, é um determinado valor. Por exemplo, você pode restringir o comando no exemplo anterior a símbolos que representam objetos cujo tamanho é 0xA8.

kd> x /v /s a8 nt!CmType*
global 805bd7b0   a8 nt!CmTypeString = unsigned short *[42]

Trabalhando com tipos de dados

A opção /t faz com que o depurador exiba informações sobre o tipo de dados de cada símbolo. Observe que, para muitos símbolos, essas informações são exibidas mesmo sem a opção /t . Quando você usa /t, esses símbolos têm suas informações de tipo de dados exibidas duas vezes.

0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>

0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>

O comando x exibirá uma instância de um tipo.

0:001> x foo!MyClassInstance
00f4f354          foo!MyClassInstance = 0x00f78768

O comando x não exibe nada com base apenas no nome de um tipo.

0:001> x foo!MyClass
0:001>

Para exibir informações de tipo usando o nome de um tipo, considere usar dt (Tipo de exibição), ele fornece informações para tipos e instâncias de tipos:

0:001> dt foo!MyClass
   +0x000 IntMemberVariable : Int4B
   +0x004 FloatMemberVariable : Float
   +0x008 BoolMemberVariable : Bool
   +0x00c PtrMemberVariable : Ptr32 MyClass

Trabalhando com modelos

Você pode usar curingas com o comando x para exibir classes de modelo, conforme mostrado neste exemplo.

0:001>  x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)

Considere usar o comando dt (Tipo de exibição) ao trabalhar com modelos, pois o comando x não exibe itens de classe de modelo individuais.

0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
   +0x000 __VFN_table : Ptr64 
   +0x008 componentConfig_ : Ptr64 Common::ComponentConfig
   +0x010 section_         : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
   +0x038 key_             : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >

Confira também

Verificando símbolos

dv (Exibir variáveis locais)