无论是在windows上进行User mode application 开发还是进行kernel mode的驱动开发,都会涉及到对程序的调试。众多工具中windbg则是最全面、适应性最广的一个。熟悉其中所有的命令则是最基础的技能。这个系列将全面的介绍windbg命令。
基础知识
对于windbg command而言,是不区分大小写的。如果一行需要使用多个command可以使用分号(;)分隔。
kd> k;lmi
对于可以接收参数的command,可以使用逗号(,)来分隔。第一个参数例外,可以连着命令本身,但是前提不能引起歧义。
kd> da 0xffff1234
可以输入的命令,可以分为4类:
- 命令标识符 Command Token
- 命令 Command
- 元命令 Mata-Command
- 扩展命令 Extension Command
命令标识符是windbg内置布局内存操作功能的一些关键字,包括控制符号和分号之类的。普通命令内置的可以操作访问目标内存相关的命令。元命令控制debug环境之类的一些命令,也是内置的。扩展命令是有插件dll导入的实现功能的命令,虽然windbg自带了很多扩展命令,但是通过扩展命令机制允许开发者自己实现自己的命令。之后会分别详细介绍。
Command Token
; Command Separator
用来分割同一行中的多个命令。从左往右执行。
有些命令会把其后的内容当成是自己的命令,因此这些参数不能够跟分号,例如as命令。
{} Block Delimiter
通常用在进行命令行编程的时候使用,这是被{}括起来的内容被认为是一个语句块。每个block必须跟在一个流程控制命令或者.block命令后面。有一个细节就是一个block中所定义的别名只能在下一个block中生效,
${} Alias Interpreter
展开一个用户命名的别名。
$$ Comment Specifier
可以注释$$之后的内容,到分号为止
* Comment Line Specifier
注释*以后的内容,一直到行尾
.block
引入一个独立的block,其中的内容用{}括起来。常用来展开别名。
.break,.leave
作用和C/C++中的break命令类似,即条出一个控制流,例如.if, while, .do命令
.leave 可以用来直接离开一个.catch 块。
.catch
类似C++中的catch,能够在error发生的时跳过catch块中的命令,从该块后开始继续执行命令,从而避免因为一个error就导致程序被中断执行。
.continue
和C一样,能够跳过该次循环。
.do, .while
都是循环控制命令, 能够循环执行其中的块的。并没有while这个关键字在windbg中。
注意他们不像C/C++一样连着使用。
.if, .else, .elsif
这三个命令和C中if, else,else if 类似。
.for
和C中for类似,但是可能看到出现多个分号的情况,因此最后一个自增表达式必须用分号来分割多个命令。
.foreach
可以针对其中的command的输出内容parse并处理。
.printf
和C类似,而且也提供了格式化的参数。而且还支持DML Debugger Markup Language 格式输出。