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