GDB 快速参考

GDB 快速参考 GDB 版本 4

基本命令

b [file:]function 设置断点在函数 [在文件内]
run [arglist] 运行你的程序 [带参数列表]
bt 回溯:显示程序堆栈
p expr 显示表达式的值
c 继续运行你的程序
n 下一行,跳过函数调用
s 下一行,进入函数调用

启动 GDB

gdb 启动 GDB,不带调试文件
gdb program 开始调试程序
gdb program core 调试由程序产生的核心转储文件
gdb –help 描述命令行选项

停止 GDB

quit 退出 GDB;也可用 q 或 EOF (例如 C-d)
INTERRUPT (例如 C-c) 终止当前命令,或发送到正在运行的进程

获取帮助

help class 列出命令类别
help 单行描述所有命令
help command 描述命令

执行你的程序

run arglist 使用参数列表启动你的程序
run 使用当前参数列表启动你的程序
run <inf>outf 启动你的程序,输入、输出重定向
kill 杀死正在运行的程序
tty dev 使用 dev 作为下一次运行的标准输入和标准输出
set args arglist 为下一次运行指定参数列表
set args 指定空参数列表
show args 显示参数列表
show env 显示所有环境变量
show env var 显示环境变量 var 的值
set env var string 设置环境变量 var
unset env var 从环境中移除 var

Shell 命令

cd dir 将工作目录更改为 dir
pwd 打印工作目录
make 调用 “make”
shell cmd 执行任意 shell 命令字符串

[] 括起可选参数
… 显示一个或多个参数

断点和监视点

break [file:]line 在行号处设置断点 [在文件内]
b [file:]line 设置断点在函数 [在文件内]
例如:
break main.c:37
break [file:] func
break +offset 在当前停止位置偏移 lines 行设置断点
break -offset 在当前停止位置偏移 lines 行之前设置断点
break *addr 在地址 addr 处设置断点
break 在下一条指令处设置断点
break if expr 在非零 expr 条件下设置断点
cond n [expr] 对断点 n 设置新的条件表达式;如果没有 expr 则设为无条件
tbreak 临时断点;到达时禁用
rbreak regex 在所有匹配正则表达式的函数上设置断点
watch expr 为表达式 expr 设置一个监视点
catch event 在事件发生时中断,事件可以是 catch、throw、exec、fork、vfork、load 或 unload。
info break 显示已定义的断点
info watch 显示已定义的监视点
clear [file:]fun 删除 fun() 入口处的断点
clear [file:]line 删除源代码行上的断点
delete [n] 删除断点 [或断点 n]
disable [n] 禁用断点 [或断点 n]
enable [n] 启用断点 [或断点 n]
enable once [n] 启用断点 [或断点 n];到达时再次禁用
enable del [n] 启用断点 [或断点 n];到达时删除
ignore n count 忽略断点 n,count 次
commands n [silent] 每次到达断点 n 时执行 GDB 命令列表。silent 禁止默认显示
command-list 命令列表
end 命令列表结束

程序堆栈

backtrace [n] 打印堆栈中所有帧的跟踪;或 n 个帧 - 如果 n>0 则为最内层,如果 n<0 则为最外层
bt [n]
frame [n] 选择帧号 n 或地址 n 处的帧;如果没有 n,则显示当前帧
up n 向上选择 n 个帧
down n 向下选择 n 个帧
info frame [addr] 描述选定的帧,或地址 addr 处的帧
info args 选定帧的参数
info locals 选定帧的局部变量
info reg [rn]… 选定帧中寄存器 rn 的寄存器值;all-reg 包括浮点

执行控制

continue [count] 继续运行;如果指定了 count,则下一次 count 次忽略此断点
c [count]
step [count] 执行直到到达另一行;如果指定了 count,则重复 count 次
s [count]
stepi [count] 按机器指令而不是源代码行执行
si [count]
next [count] 执行下一行,包括任何函数调用
n [count]
nexti [count] 下一条机器指令,而不是源代码行
ni [count]
until [location] 运行到下一条指令(或位置)
finish 运行到选定的堆栈帧返回
return [expr] 弹出选定的堆栈帧而不执行,设置返回值
signal num 使用信号 s 恢复执行(如果为 0 则无信号)
jump line 在指定的行号或地址恢复执行
jump *address
set var=expr 计算 expr 而不显示它;用于更改程序变量

显示

print [/f] [expr] 根据格式 f 显示 expr [或最后一个值 $] 的值:
p [/f] [expr]
x 十六进制
d 有符号十进制
u 无符号十进制
o 八进制
t 二进制
a 地址,绝对和相对
c 字符
f 浮点
call [/f] expr 类似于 print,但不显示 void
x [/Nuf] expr 检查地址 expr 处的内存;可选格式跟随斜杠
N 显示多少个单位的计数
u 单位大小;其中之一:

  • b 单个字节
  • h 半字(两个字节)
  • w 字(四个字节)
  • g 巨字(八个字节)
  • f 打印格式。任何打印格式,或
  • s 以 null 结尾的字符串
  • i 机器指令

disassem [addr] 将内存显示为机器指令

自动显示

display [/f] expr 每次程序停止时,根据格式 f 显示 expr 的值
display 列出所有启用的表达式
undisplay n 从自动显示表达式列表中删除编号 n
disable disp n 禁用表达式编号 n 的显示
enable disp n 启用表达式编号 n 的显示
info display 自动显示表达式的编号列表

表达式

expr C、C++ 或 Modula-2 中的表达式(包括函数调用),或:
addr@len 从 addr 开始的 len 个元素的数组
file::nm 文件中定义的变量或函数 nm
{type} addr 将地址 addr 处的内存读取为指定类型
$ 最近显示的值 $n 第 n 个显示的值
$$ $ 之前的显示值
$$n 从 $ 回溯的第 n 个显示值
$_ 最后用 x 检查的地址
$__ $_ 处的地址值
$var 方便变量;分配任何值
show values [n] 显示最后 10 个值 [或 $n 周围的值]
show conv 显示所有方便变量

符号表

info address s 显示符号 s 存储的位置
info func [regex] 显示已定义函数的名称、类型(全部或匹配正则表达式)
info var [regex] 显示全局变量的名称、类型(全部或匹配正则表达式)
whatis [expr] 显示 expr [或 $] 的数据类型而不进行计算;ptype 提供更多详细信息
ptype [expr]
ptype type 描述类型、结构、联合或枚举

GDB 脚本

source script 从文件 script 读取并执行 GDB 命令
define cmd 创建新的 GDB 命令 cmd;执行由 command-list 定义的脚本
command-list
end 命令列表结束
document cmd 为新的 GDB 命令 cmd 创建在线文档
help-text
end 帮助文本结束

信号

handle signal act 为信号指定 GDB 操作:

  • print 宣布信号
  • noprint 对信号保持静默
  • stop 在信号上停止执行
  • nostop 不要停止执行
  • pass 不要让你的程序看到信号
  • nopass 允许你的程序处理信号
  • info signals 显示信号表,每个信号的 GDB 操作

调试目标

target type param 连接到目标机器、进程或文件
help target 显示可用目标
attach param 连接到另一个进程
detach 从 GDB 控制中释放目标

控制 GDB

set param value 设置 GDB 的内部参数之一
show param 显示参数的当前设置

set 和 show 理解的参数:
complaint limit 异常符号上的消息数
confirm on/off 启用或禁用警告查询
editing on/off 控制 readline 命令行编辑
height lpp 显示暂停前的行数
language lang GDB 表达式的语言(auto、c 或 modula-2)
listsize n list 显示的行数
prompt str 使用 str 作为 GDB 提示符
radix base 八进制、十进制或十六进制表示
verbose on/off 加载符号时的控制消息
width cpl 折叠行之前的字符数
write on/off 允许或禁止修补二进制文件、核心文件(使用 exec 或 core 重新打开时)

history 具有以下选项的组:
h
h exp off/on 禁用/启用 readline 历史扩展
h file filename 用于记录 GDB 命令历史的文件
h size size 历史列表中保留的命令数
h save off/on 控制使用外部文件进行命令历史记录

print 具有以下选项的组:
p
p address on/off 在堆栈、值中打印内存地址
parray off/on 数组的紧凑或吸引人的格式
p demangle on/off C++ 符号的源代码(解压缩)或内部形式
pasm-dem on/off 在机器指令输出中解压缩 C++ 符号
p elements limit 要显示的数组元素数限制
pobject on/off 为对象打印 C++ 派生类型
p pretty off/on 结构显示:紧凑或缩进
punion on/off 联合成员的显示
pvtbl off/on C++ 虚函数表的显示

show commands 显示最后 10 个命令
show commands n 显示编号 n 前后的 10 个命令
show commands + 显示接下来的 10 个命令

工作文件

file [file] 将文件用于符号和可执行文件;如果没有参数,则丢弃两者
core [file] 将文件读取为核心转储;或丢弃
exec [file] 仅将文件用作可执行文件;或丢弃
symbol [file] 使用文件中的符号表;或丢弃
load file 动态链接文件并添加其符号
add-sym file addr 从文件读取其他符号,动态加载到地址 addr
info files 显示正在使用的文件和目标
path dirs 将 dirs 添加到搜索可执行文件和符号文件的路径的前面
show path 显示可执行文件和符号文件路径
info share 列出当前加载的共享库的名称

源文件

dir names 将目录名称添加到源路径的前面
dir 清除源路径
show dir 显示当前源路径
list 显示接下来的十行源代码
list - 显示前十行
list lines 显示周围的源代码行,指定为:

  • [file:]num 行号 [在命名文件内]
  • [file:]function 函数的开头 [在命名文件内]
  • +off 最后打印的行之后的 off 行
  • -off 最后打印的行之前的 off 行
  • *address 包含地址的行
    list f,l 从行 f 到行 l
    info line num 显示源代码行 num 的编译代码的起始地址和结束地址
    info source 显示当前源文件的名称
    info sources 列出所有正在使用的源文件
    forw regex 在以下源代码行中搜索正则表达式
    rev regex 在前面的源代码行中搜索正则表达式

GNU Emacs 下的 GDB

M-x gdb 在 Emacs 下运行 GDB
C-h m 描述 GDB 模式
M-s 单步执行一行 (step)
M-n 下一行 (next)
M-i 单步执行一条指令 (stepi)
C-c C-f 完成当前堆栈帧 (finish)
M-c 继续 (cont)
M-u 向上参数帧 (up)
M-d 向下参数帧 (down)
C-x & 从点复制数字,插入到末尾
C-x SPC (在源文件中) 在点处设置断点

GDB 许可证

show copying 显示 GNU 通用公共许可证
show warranty GDB 没有保修。
显示完整的无保修声明。

版权所有 1991、‘92、‘93、‘98 自由软件基金会,Inc.
Roland H. Pesch

作者对本卡片上的任何错误不承担任何责任。

本卡片可以在 GNU 通用公共许可证的条款下自由分发。

请通过注释来为本卡片的开发做出贡献。
改进可以发送到 bug-gdb@gnu.org

GDB 本身是免费软件;欢迎您在 GNU 通用公共许可证的条款下分发它的副本。GDB 绝对没有保修。