cc682/NetRoc
http://netroc682.spaces.live.com/
命令
本节中的参考讨论可以在CDB、KD和WinDbg中使用的各种调试器命令。
ENTER (Repeat Last Command)
ENTER 键重复前一次输入的命令。
语法
ENTER
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
在CDB和KD中,在命令提示符下按下ENTER 本身,会执行前一次输入过的命令。
在WinDbg中,ENTER 键可以设置为无效或者重复上一条命令。可以在Options 对话框设置该选项。(点击View菜单上的Options,或者点击工具栏上的Options按钮()来打开Options对话框。)
如果将ENTER设置为重复上一条命令,但是又想在调试器命令窗口中产生一些空白,可以使用 * (Comment Line Specifier)关键字并按下ENTER数次。
$<, $><, $$<, $$><, $$>a< (Run Script File)
$<、 $><、$$<、$$><和$$>a< 命令读取指定的脚本文件的内容作为输入的调试器命令。
语法
$<Filename
$><Filename
$$< Filename
$$>< Filename
$$>a< Filename arg1 arg2 arg3 ... argn
参数
Filename
指定包含合法的调试器命令文本的文件。文件名必须符合Microsoft Windows文件命名规范。文件名中可以有空格。
argn
指定传递给脚本文件的参数。这些参数可以是引号括起来的字符串或者空格分隔的字符串。所有参数都是可选的。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
如果该命令使用$$<或$$><关键字,则关键字 和Filename 之间的空格是可选的。不管Filename是否包含空格,都可以使用引号来把它括起来。可以在该命令后添加一个分号或其他命令。
如果该命令使用$<或$><关键字,则不能在它和Filename之间加入任何空格。 不能使用引号来包含Filename 。该命令之后不能添加分号或其他命令。
$< 和$$<关键字逐个执行脚本文件中的命令。$><和$$><关键字打开脚本文件,将所有回车替换为分号,然后将转换后的文本当作单个命令块来执行。这些关键字在运行包含调试器命令程序的脚本时非常有用。关于这种程序的更多信息,查看使用调试器命令程序。$$>a<关键字允许传递参数给脚本。
下表是如何使用这些命令的摘要信息。
关键字
|
文件名前是否允许空格?
|
是否将脚本精简为单个命令块?
|
$<
|
否
|
否
|
$><
|
否
|
是
|
$$<
|
是
|
否
|
$$><
|
是
|
是
|
$$>a<
|
是
|
是
|
调试器执行脚本文件时,命令和它们的输出都会在调试器命令窗口显示出来。当到达脚本末尾时,控制权返回到调试器。
脚本文件可以嵌套。如果调试器在脚本文件中遇到了这样的关键字,执行会移交给新的脚本文件,并且在它执行完成之后返回到先前的位置。脚本也可以被递归调用。
在WinDbg中,可以将附加的命令文本粘贴到调试器命令窗口中。
示例
下面的例子示范了如何将参数传递给脚本文件Myfile.txt。假设该文件包含如下文本:
.echo The first argument is ${$arg1}.
.echo The second argument is ${$arg2}.
可以通过使用类似这样的命令将参数传递给它:
0:000> $$>a<myfile.txt myFirstArg mySecondArg
命令的结果如下:
The first argument is myFirstArg.
The second argument is mySecondArg.
? (Command Help)
问号(?)字符用来显示所有命令和操作符的列表。
注意 单独的一个问号用来显示命令帮助。? expression语法用来计算给定表达式的值。
语法
?
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
查看标准命令的更多信息,可以使用?。查看元命令的更多信息,使用.help。查看扩展命令的信息,使用 !help。
? (Evaluate Expression)
(?) 命令可用于计算和显示一个表达式的值。
注意 单个问号(?)显示命令帮助。? expression 命令计算给定表达式的值。
语法
? Expression
参数
Expression
指定要计算的表达式。
Environment
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
?命令的输入和输出依赖于使用MASM表达式语法还是C++表达式语法。关于这积累表达式语法的更多信息,查看表达式求值和数值表达式语法。
如果使用MASM语法,输入和输出都依赖于当前的基数。要改变基数,使用n (Set Number Base)命令。
?命令在当前线程和进程上下文中计算表达式中符号的值。
See Also
?? (Evaluate C++ Expression), .formats (Show Number Formats)
?? (Evaluate C++ Expression)
双问号(??)命令根据C++表达式规则来计算和显示表达式的值。
语法
?? Expression
参数
Expression
指定要求值的C++表达式。语法的更多信息,查看C++数值和操作符。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
??命令根据当前线程和进程上下文来对表达式中的符号进行求值。
如果要使用MASM表达式规则来为Expression 表达式的一部分进行求值,可以将这部分用圆括号括起来并在前面添加两个at符号( @@ )。关于MASM和C++表达式的更多信息,查看表达式求值和数值表达式语法
参见
? (Evaluate Expression)、 .formats (Show Number Formats)
# (Search for Disassembly Pattern)
数字号(#)命令在反汇编代码中搜索符合指定模板的数据。
语法
# [Pattern] [Address [ L Size ]]
参数
Pattern
指定用于在反汇编代码中搜索的模板。Pattern可以包含各种通配符和修饰符。关于该语法的更多信息,查看字符串通配符语法。如果在Pattern中包含空格,需要将模板用引号括起来。模板是不区分大小写的。如果之前使用过#命令,并且省略掉Pattern ,该命令会使用上一次的模板。
Address
指定搜索开始的地址。该语法的更多信息,查看地址和地址范围语法。
Size
指定要搜索的指令数量。如果省略掉Size ,会一直搜索直到遇到匹配项。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
如果之前使用过#命令并且省略掉Address ,会从上次搜索结束的地方开始搜索。
该命令通过搜索反汇编文本来查找指定的模板。可以使用该命令来查找寄存器名、常数或其他任何在反汇编输出中出现的字符串。可以反复使用不带Address 参数的命令来顺序查找匹配模板的项。
可以使用u (Unassemble) 命令或在WinDbg反汇编窗口中查看反汇编代码。反汇编的输出包含四个部分:地址偏移、二进制代码、汇编语言助记符合汇编语言详细信息。下面是这种显示的例子。
0040116b 45 inc ebp
0040116c fc cld
0040116d 8945b0 mov eax,[ebp-0x1c]
#命令可以在反汇编输出的任意单独部分中搜索文本。例如,使用# eax 0040116b 来在0040116d 地址查找mov eax,[ebp-0x1c] 指令。下面的命令也能搜索到该指令。
# [ebp?0x 0040116b
# mov 0040116b
# 8945* 0040116b
# 116d 0040116b
但是,不能将mov eax*作为单独的单元来进行搜索,因为mov 和eax 出现在输出的不同部位。
另一个示例,可以使用下面的命令在入口点main 中查找对strlen 的第一个引用。
# strlen main
类似的,可以使用下面两个命令来查找0x779F9FBA 之后的第一个jnz 指令,并再查找之后的下一条jnz 指令。
# jnz 779f9fba#
省略Pattern 或Address 时,他们的值由上一次的#命令决定。如果第一次使用#命令时省略掉它们中的一个,则不会进行搜索。但是即使在这种情况下Pattern 和Address 的值也会被初始化。
如果包含了Pattern 或Address,它的值被设置成输入的值。如果省略Address,它会被设置为程序计数器的当前值。如果省略掉Pattern ,会被设置为任意的空模板。
附加信息
关于汇编调试和相关命令的更多信息,查看汇编模式下的调试。
|| (System Status)
双竖线(||)命令打印指定系统或当前正在调试的所有系统的状态信息。
不要将该命令和| (Process Status)命令混淆。
语法
|| System
参数
System
指定要显示的系统。如果省略掉该参数,所有被调试的系统都会显示出来。该语法的更多信息,查看系统语法。
环境
模式
|
多目标调试
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
||仅在调试多个目标时有用。很多,但不是全部的多目标调试会话会使用到多系统。关于这些会话的更多信息,查看调试多个目标。
每个系统的信息包含服务器名字和详细的协议信息。调试器运行的系统被标识为<Local>。
下面是如何使用该命令的示例。下面的命令显示所有系统。
3:2:005> ||
这个命令也显示所有系统。
3:2:005> ||*
下面的命令显示当前的活动系统。
3:2:005> ||.
下面的例子显示最近一次异常或中断发生的系统。
3:2:005> ||#
下面显示编号为2的系统。
3:2:005> ||2
||s (Set Current System)
||s命令设置或显示当前系统号。
不要将该命令和s (Search Memory)、 ~s (Change Current Processor)、 ~s (Set Current Thread)或 |s (Set Current Process) 命令混淆。
语法
||System s
|| s
参数
System
指定要激活的系统。该语法的更多信息,查看系统语法。
环境
模式
|
多目标调试
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
||s命令仅在多目标调试时有用。很多,但不是全部的多目标调试会话会使用到多系统。关于这些会话的更多信息,查看调试多个目标。
如果使用||s语法,调试器显示当前系统的信息。
该命令也会反汇编当前系统、当前进程、当前线程的当前指令。
| (Process Status)
管道(|)命令显示指定进程或当前正在调试的所有进程的信息。
不要将该命令和|| (System Status)命令混淆。
语法
| Process
参数
Process
指定要显示的进程。如果省略掉该参输,则显示所有进程。该语法的更多信息,查看进程语法。
环境
模式
|
仅用户模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
仅能在用户模式下指定进程。
可以在很多命令前添加一个进程符号。关于在命令后接一个管道(|)的意义的信息,查看每个命令本身的说明。
除非在启动调试会话时启用了对子进程的调试,否则仅有一个进程对调试器是可用的。
下例说明了如何使用该命令。例中的命令显示所有进程。
2:005> |
下例也显示所有进程。
2:005> |*
下面的命令显示当前的激活进程。
2:005> |.
下面的命令显示最初产生异常的进程(或者调试器最初附加到的进程)。
2:005> |#
下面的命令显示号码为2的进程。
2:005> |2
前面的命令显示如下输出。
0:002> |
# 0 id: 224 name: myprog.exe
1 id: 228 name: onechild.exe
. 2 id: 22c name: anotherchild.exe
在输出的第一行,0是一个十进制进程号,224是16进制进程ID,Myprog.exe 是进程的程序名。进程2前面的点号(.) 表示该进程为当前进程。进程0前面的数字号(#)表示该进程是最初产生异常或调试器附加到的进程。
附加信息
关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程。
|s (Set Current Process)
|s命令设置或显示当前进程号。
不要将该命令和s (Search Memory)、~s (Change Current Processor)、 ~s (Set Current Thread)或 ||s (Set Current System)命令混淆。
语法
|Process s
| s
参数
Process
指定要显示或设置的进程。关于该语法的更多信息,查看进程语法。
环境
模式
|
仅用户模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
只能在用户模式下指定进程。
如果使用|s语法,调试器现实当前进程的信息。
该命令也会反汇编当前系统、当前进程、当前线程的当前指令。
附加信息
关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程。
~ (Thread Status)
波形符(~) 命令显示指定线程或当前进程中的所有线程的信息。
语法
~ Thread
参数
Thread
指定要显示的线程。如果省略该参数,则显示所有线程。该语法的更多信息,查看线程语法。
环境
模式
|
仅用户模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
只有在用户模式下才能显示线程。在内核模式下,波形符 (~)用于引用处理器。
可以在很多命令中添加线程符号。关于在这些命令中使用的波形符的意义的更多信息,查看这些命令本身的说明。
下面这些示例说明了该命令的使用方法。这条命令显示所有线程。
0:001> ~
该命令也显示所有线程。
0:001> ~*
下面的命令显示当前活动线程。
0:001> ~.
下面的命令显示原始的产生异常的线程(或调试器附加到进程时活动的线程)。
0:001> ~#
下面显示号码为2的线程。
0:001> ~2
上面的命令会产生如下输出。
0:001> ~
0 id: 4dc.470 Suspend: 0 Teb 7ffde000 Unfrozen
. 1 id: 4dc.534 Suspend: 0 Teb 7ffdd000 Unfrozen
# 2 id: 4dc.5a8 Suspend: 0 Teb 7ffdc000 Unfrozen
输出的第一行上,0是10进制线程号,4DC是16进制进程ID,470是16进制线程ID,0x7FFDE000是TEB 地址,Unfrozen 是线程状态。线程1前面的点号(.)表示它是当前线程。线程2前面的数字号(#)表示它是产生异常或调试器附加到进程时活动的线程。
附加信息
关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程。