x(检查符号)

x 命令显示与指定模式匹配的所有上下文中的符号。

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

参数

选项 指定符号搜索选项。 可以使用下列一个或多个选项:

/0
仅显示每个符号的地址。

/1
仅显示每个符号的名称。

/2
仅显示每个符号的地址和名称(而不是数据类型)。

/D
使用调试器标记语言显示输出。

/t
如果数据类型已知,则显示每个符号的数据类型。

/v
显示每个符号的符号类型(本地、全局、参数、函数或未知)。 此选项还显示每个符号的大小。 函数符号的大小是内存中函数的大小。 其他符号的大小是符号所表示的数据类型的大小。 大小始终以字节为单位,以十六进制格式显示。

/s 大小
仅显示大小等于 Size 值的符号(以字节为单位)。 函数符号的大小是内存中函数的大小。 其他符号的大小是符号所表示的数据类型的大小。 无法确定其大小始终显示的符号。 大小 必须是非零整数。

/q
以带引号的格式显示符号名称。

/p
当调试器显示函数名称及其参数时,省略左括号之前的空格。 如果将函数名称和参数从 x 显示器复制到另一个位置,这种显示可能会更加轻松。

/f
显示函数的数据大小。

/d
显示数据的数据大小。

/a
按地址按升序对显示进行排序。

/一个
按地址按降序对显示进行排序。

/n
按名称按升序对显示进行排序。

/N
按名称按降序对显示进行排序。

/z
按大小按升序对显示进行排序。

/Z
按大小按降序对显示进行排序。

模块
指定要搜索的模块。 此模块可以是.exe、.dll或.sys文件。 模块可以包含各种通配符字符和说明符。 有关语法的详细信息,请参阅字符串通配符语法

象征
指定符号必须包含的模式。 符号 可以包含各种通配符和说明符。 有关语法的详细信息,请参阅字符串通配符语法

由于此模式与符号匹配,因此匹配不区分大小写,并且单个前导下划线 (_) 表示任意数量的前导下划线。 可以在 Symbol 中添加空格,以便可以指定包含空格的符号名称(如“operator new”或“Template<A, B>”),而无需使用通配符。

环境

说明
模式 用户模式、内核模式
目标 实时、崩溃转储
平台 全部

注解

以下命令查找 MyModule 中包含字符串“spin”的所有符号。

0:000> x mymodule!*spin* 

以下命令在 MyModule 中快速找到“DownloadMinor”和“DownloadMajor”符号。

0:000> x mymodule!downloadm??or 

还可以使用以下命令显示 MyModule 中的所有符号。

0:000> x mymodule!* 

上述命令还强制调试器从 MyModule 重新加载符号信息。 如果要在模块中以最少的显示方式重新加载符号,请使用以下命令。

0:000> x mymodule!*start* 

几个符号始终包含字符串“start”。 因此,上述命令始终显示一些输出,以验证该命令是否正常工作。 但上述命令避免了 x mymodule!*过度显示长度。

显示每个符号的起始地址和完整的符号名称。 如果符号是函数名称,则显示还包含其参数类型的列表。 如果符号是全局变量,则显示其当前值。

x 命令有另外一个特殊情况。 若要显示当前上下文的所有局部变量的地址和名称,请使用以下命令。

0:000> x * 

请注意 ,在大多数情况下,除非加载了专用符号,否则无法访问局部变量。 有关这种情况的详细信息,请参阅 dbgerr005:需要专用符号。 若要显示局部变量的值,请使用 dv (显示局部变量) 命令。

下面的示例演示 了 /0/1/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

如果要将 x 命令的输出用作 .foreach 命令的输入,则 /0/1/2 选项非常有用。

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

以下示例演示了在模块notepad.exe上筛选函数时的开关 /f

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)

使用 /v 选项时,显示的第一列显示符号类型(本地、全局、参数、函数或未知)。 第二列是符号的地址。 第三列是符号的大小(以字节为单位)。 第四列显示模块名称和符号名称。 在某些情况下,此显示后跟一个等号(=),然后是符号的数据类型。 还会显示符号(公共或完整符号信息)的来源。

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]

在前面的示例中,以十六进制格式提供大小,而数据类型以十进制格式提供。 因此,在前面的示例中的最后一行中,数据类型是指向无符号短整数的 42 个指针的数组。 此数组的大小为 42*4 = 168,168 以十六进制格式显示为0xA8。

可以使用 /sSize 选项仅显示其大小(以字节为单位)为特定值的符号。 例如,可以将上述示例中的命令限制为表示其大小0xA8对象的符号。

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

使用数据类型

/t 选项会导致调试器显示有关每个符号的数据类型的信息。 请注意,对于许多符号,即使没有 /t 选项,也会显示此信息。 使用 /t 时,此类符号的数据类型信息显示两次。

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>

x 命令将显示类型的实例。

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

x 命令不基于类型的名称显示任何内容。

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

若要使用类型名称显示类型信息,请考虑使用 dt(显示类型),它提供类型类型和实例的信息:

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

使用模板

可以将通配符与 x 命令一起使用来显示模板类,如此示例所示。

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)

使用模板时,请考虑使用 dt (显示类型) 命令,因为 x 命令不显示单个模板类项。

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

另请参阅

验证符号

dv (显示局部变量)