x (Examinar símbolos)
El comando x muestra los símbolos en todos los contextos que coinciden con el patrón especificado.
x [Options] Module!Symbol
x [Options] *
Parámetros
Opciones Especifica opciones de búsqueda de símbolos. Puede usar una o varias de las siguientes opciones:
/0
Muestra solo la dirección de cada símbolo.
/1
Muestra solo el nombre de cada símbolo.
/2
Muestra solo la dirección y el nombre de cada símbolo (no el tipo de datos).
/D
Muestra la salida mediante el lenguaje de marcado del depurador.
/t
Muestra el tipo de datos de cada símbolo, si se conoce el tipo de datos.
/v
Muestra el tipo de símbolo (local, global, parámetro, función o desconocido) de cada símbolo. Esta opción también muestra el tamaño de cada símbolo. El tamaño de un símbolo de función es el tamaño de la función en memoria. El tamaño de otros símbolos es el tamaño del tipo de datos que representa el símbolo. El tamaño siempre se mide en bytes y se muestra en formato hexadecimal.
/s Size
Muestra solo los símbolos cuyo tamaño, en bytes, es igual al valor de Size. El tamaño de un símbolo de función es el tamaño de la función en memoria. El tamaño de otros símbolos es el tamaño del tipo de datos que representa el símbolo. Los símbolos cuyo tamaño no se puede determinar siempre se muestran. El tamaño debe ser un entero distinto de cero.
/q
Muestra los nombres de símbolos en formato entre comillas.
/p
Omite el espacio antes del paréntesis de apertura cuando el depurador muestra un nombre de función y sus argumentos. Este tipo de presentación puede facilitar la copia de los nombres de función y los argumentos de la pantalla x a otra ubicación.
/f
Muestra el tamaño de los datos de una función.
/d
Muestra el tamaño de los datos.
/a
Ordena la presentación por dirección, en orden ascendente.
/Un
Ordena la presentación por dirección, en orden descendente.
/n
Ordena la presentación por nombre, en orden ascendente.
/N
Ordena la presentación por nombre, en orden descendente.
/z
Ordena la presentación por tamaño, en orden ascendente.
/Z
Ordena la presentación por tamaño, en orden descendente.
Módulo
Especifica el módulo que se va a buscar. Este módulo puede ser un archivo .exe, .dll o .sys. Module puede contener una variedad de caracteres comodín y especificadores. Para obtener más información sobre la sintaxis, consulte Sintaxis de caracteres comodín de cadena.
Símbolo
Especifica un patrón que debe contener el símbolo. El símbolo puede contener una variedad de caracteres comodín y especificadores. Para obtener más información sobre la sintaxis, consulte Sintaxis de caracteres comodín de cadena.
Dado que este patrón coincide con un símbolo, la coincidencia no distingue mayúsculas de minúsculas y un único carácter de subrayado inicial (_) representa cualquier cantidad de caracteres de subrayado iniciales. Puede agregar espacios dentro de Symbol para que pueda especificar nombres de símbolos que contengan espacios (como "operador new" o "Template<A, B>") sin usar caracteres comodín.
Entorno
Elemento | Descripción |
---|---|
Modos | Modo de usuario, modo kernel |
Destinos | En tiempo real, volcado de errores |
Platforms | All |
Comentarios
El siguiente comando busca todos los símbolos de MyModule que contienen la cadena "spin".
0:000> x mymodule!*spin*
El siguiente comando busca rápidamente los símbolos "DownloadMinor" y "DownloadMajor" en MyModule.
0:000> x mymodule!downloadm??or
También puede mostrar todos los símbolos en MyModule mediante el comando siguiente.
0:000> x mymodule!*
Los comandos anteriores también obligan al depurador a volver a cargar información de símbolos de MyModule. Si desea volver a cargar los símbolos en el módulo con una pantalla mínima, use el siguiente comando.
0:000> x mymodule!*start*
Algunos símbolos siempre contienen la cadena "start". Por lo tanto, el comando anterior siempre muestra alguna salida para comprobar que el comando funciona. Pero el comando anterior evita la longitud de visualización excesiva de x mymodule!*.
La pantalla muestra la dirección inicial de cada símbolo y el nombre de símbolo completo. Si el símbolo es un nombre de función, la pantalla también incluye una lista de sus tipos de argumentos. Si el símbolo es una variable global, se muestra su valor actual.
Hay otro caso especial del comando x . Para mostrar las direcciones y los nombres de todas las variables locales para el contexto actual, use el siguiente comando.
0:000> x *
Nota En la mayoría de los casos, no se puede acceder a las variables locales a menos que se hayan cargado símbolos privados. Para obtener más información sobre esta situación, vea dbgerr005: Símbolos privados necesarios. Para mostrar los valores de las variables locales, use el comando dv (Mostrar variables locales).
En el ejemplo siguiente se muestran las opciones /0, /1 y /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
Las opciones /0, /1 y /2 son útiles si desea usar la salida del comando x como entrada para el comando .foreach .
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
En el ejemplo siguiente se muestra el modificador /f cuando se usa para filtrar las funciones del 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)
Cuando se usa la opción /v , la primera columna de la pantalla muestra el tipo de símbolo (local, global, parámetro, función o desconocido). La segunda columna es la dirección del símbolo. La tercera columna es el tamaño del símbolo, en bytes. La cuarta columna muestra el nombre del módulo y el nombre del símbolo. En algunos casos, esta presentación va seguida de un signo igual (=) y, a continuación, el tipo de datos del símbolo. También se muestra el origen del símbolo (información pública o completa de símbolos).
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]
En el ejemplo anterior, el tamaño se da en formato hexadecimal, mientras que el tipo de datos se da en formato decimal. Por lo tanto, en la última línea del ejemplo anterior, el tipo de datos es una matriz de 42 punteros a enteros cortos sin signo. El tamaño de esta matriz es 42*4 = 168 y 168 se muestra en formato hexadecimal como 0xA8.
Puede usar la opción /sSize para mostrar solo los símbolos cuyo tamaño, en bytes, es un valor determinado. Por ejemplo, puede restringir el comando del ejemplo anterior a símbolos que representan objetos cuyo tamaño es 0xA8.
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Trabajar con tipos de datos
La opción /t hace que el depurador muestre información sobre el tipo de datos de cada símbolo. Tenga en cuenta que para muchos símbolos, esta información se muestra incluso sin la opción /t . Cuando se usa /t, estos símbolos muestran dos veces su información de tipo de datos.
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>
El comando x mostrará una instancia de un tipo.
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
El comando x no muestra nada basado solo en el nombre de un tipo.
0:001> x foo!MyClass
0:001>
Para mostrar información de tipo con el nombre de un tipo, considere la posibilidad de usar dt (Tipo de presentación), proporciona información para los tipos e instancias de tipos:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
Trabajar con plantillas
Puede usar caracteres comodín con el comando x para mostrar clases de plantilla como se muestra en este ejemplo.
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 la posibilidad de usar el comando dt (Display Type) al trabajar con plantillas, ya que el comando x no muestra elementos de clase de plantilla individuales.
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> >