Debugging Tools for Windows

x (Examine Symbols)

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

语法

x [OptionsModule!Symbol 
x [Options* 

参数

Options
指定符号搜索选项。可以使用下面这些选项的一个或者多个:
/t
如果知道数据类型的话,显示每个符号的数据类型。
/v
显示每个符号的符号类型(局部、全局、参数或未知) 。该选项还显示每个符号的大小。函数符号的大小是该函数在内存中的大小。其他符号的大小是该符号对应的数据类型的大小。该大小总是以字节为单位并且以16进制形式显示。
/s Size
仅显示以字节为单位的大小等于Size的符号。函数符号的大小是该函数在内存中的大小。其他符号的大小是该符号对应的数据类型的大小。未知大小的符号总是被显示出来。Size不能为0。
/q
以引用的形式显示符号名。
/p
显示函数名和它的参数时省略左括号前的空格。这种类型的输出使得将x的显示复制到其他地方时更容易。
/f
显示函数的数据大小。
/d
显示数据的数据大小。
/a
按照地址以升序的形式排序输出。
/A
按照地址以降序的形式排序输出。
/n
按照名字以升序的形式排序输出。
/N
按照名字以降序的形式排序输出。
/z
按照大小以升序的形式排序输出。
/Z
按照大小以降序的形式排序输出。
Module
指定要搜索的模块。该模块可以是.exe.dll.sys 文件。 Module 可以包含各种通配符和修饰符。该语法的更多信息,查看字符串通配符语法
Symbol
指定符号必须包含的模板。Symbol可以包含各种通配符和修饰符。该语法的更多信息,查看字符串通配符语法

由于该模板用来匹配符号,这种匹配是不区分大小写的,并且开头的下划线(_) 相当于任意多个下划线。在Symbol中可以加入空格,所以可以不通过通配符来指定包含空格的符号名 (例如 "operator new" 或"Template<A, B>")。

环境

模式 用户模式、内核模式
目标 活动目标,崩溃转储
平台 所有

注释

x命令显示指定模块(Module)的公有符号中匹配指定模板(Symbol)的项。例如,下面的命令查找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: Private Symbols Required。要显示局部变量的值,使用dv (Display Local Variables)命令。

下面的示例说明附加的x选项。使用/v选项时,输出的第一列显示符号类型 (local、 global、 parameter、 function或unknown)。第二列是符号地址。第三列是符号大小,以字节为单位。第四列是模块名和符号名。某些情况下,输出后面跟了一个等号 (=)和符号的数据类型。符号的来源 (公有的或完整的符号信息)也会显示出来。

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]

上例中,是以16进制给出大小,而数据类型是以10进制形式。因此,上例的最后一行中,数据类型是42个unsigned short整数的数组。数组大小是42*4 = 168,而168的16进制是0xA8。

可以使用/s Size选项来显示大小的字节数为指定值的符号。例如,可以限制上面的命令只显示相应对象的大小为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>

下面的例子说命令过滤模块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)

参见

Verifying Symbolsdv (Display Local Variables)

Build machine: CAPEBUILD