GDB 02 - Command
# 前置知识
;
# 基本语法
gdb 中的 命令 (command) 是单行输入,长度不限,由命令名称及其后的一系列参数构成(用空格隔开),例如 step 5
。
对于不同的命令,参数的数量以及每个参数的格式不同,有的命令也没有参数。
很多命令允许不同的参数列表,例如 step
或 step 5
。
(TBD)gdb 的命令中可能包含 子命令 (subcommand) ,例如 set print elements 10
。
# 命令缩写
gdb 中的命令名称可以被截断作为缩写,前提是截出的前缀不能有歧义,例如 **** 。
对于一些最常用的命令,gdb 允许极短的歧义前缀作为其缩写,例如 step
可以简写为 s
,breakpoint
可以简写为 b
,等等。
# 空行
如果在 gdb 中使用空行(即直接回车),则:
通常情况下,这意味着重复上一条命令;
- 对于
list
命令和x
命令,回车重复执行会自动构造新参数而不是完全按照键入的方式重复,这使我们可以轻松扫描源代码或内存。
- 对于
如果前一命令的输出太长,超出 shell 的高度限制,直接回车会以类似
more
的方式工作,并且超出范围后的回车不会重复上一条命令(因为很容易按错);
以 #
开头的命令将被视为注释,这主要用于 gdb script 文件中。
(TBD)Ctrl + O
的绑定技巧对于重复复杂的命令序列很有用。此命令接受当前行(如空行),然后从历史记录中获取与当前行相关的下一行以进行编辑。
# 命令选项
一些命令接受以破折号 -
开头的参数作为 选项 (option) ,例如 print -pretty
。
一些选项被设定为布尔选项,使用 true/false
、1/0
、yes/no
、enable/disable
均可指定其为打开或关闭。指定为打开时可以省略,因为使用命令选项时默认表示打开(例如 print -p
等同于 print -p on
)。
原始输入可能和命令选项混淆,例如 print -p
可能是选项 -pretty
的缩写或是对变量 取负值,因此如果使用了命令选项,需要用双破折号 --
表示所有选项都已结束:
print -object on -element unlimited -p -- -p
可以利用 TAB 补全查看所有可用的命令选项,例如键入 print -TABTAB
(这里 TABTAB
表示连按两次 TAB 键而不是输入这段文本,下同):
(gdb) print -TABTAB
-address -max-depth -object -static-members
-array -memory-tag-violations -pretty -symbol
-array-indexes -nibbles -raw-values -union
-elements -null-stop -repeats -vtbl
可以利用 TAB 补全查看所有可用的选项值,例如键入 print -elements TABTAB
:
(gdb) print -elements TABTAB
NUMBER unlimited
这里 NUMBER
表示需要一个数(例如 20
)而不是字符串 NUMBER
。这种元参数总是以全大写的形式呈现。
# 启动程序
# run 命令
# 配置执行环境
# start 命令
#
(TBD)可以通过 set
子命令改变一些命令的默认设置。
(TBD)help, info, set, show
https://sourceware.org/gdb/current/onlinedocs/gdb/Help.html#Help
- 01
- Reading Papers - Kernel Concurrency06-01
- 02
- Linux Kernel - Source Code Overview05-01
- 03
- Linux Kernel - Per-CPU Storage05-01