C gdb 调试语法速查手册

2 min入门

C gdb 调试 语法速查手册 的完整教学讲解。

启动与退出

基本写法:调试可执行文件 gdb <可执行文件>

# 加载程序进入交互调试
gdb ./app

基本写法:调试带参数程序 gdb --args <程序> <参数>...

# 启动并预设程序运行参数
gdb --args ./app -c config.txt

基本写法:附加到运行中进程 gdb -p <PID>

# 附加到已运行的进程进行调试
gdb -p 12345

基本写法:调试 core 文件 gdb <程序> <core文件>

# 分析崩溃转储文件
gdb ./app core.12345

基本写法:退出 gdb quit / q

# 退出调试器,缩写 q
(gdb) q

运行控制

基本写法:运行程序 run [r] [<参数>]

# 从头开始运行程序
(gdb) run

基本写法:重新运行 run

# 重新开始运行程序
(gdb) r

基本写法:单步步过 next [n] [<次数>]

# 执行下一行,不进入函数内部
(gdb) n

基本写法:单步步入 step [s] [<次数>]

# 执行下一行,进入函数内部
(gdb) s

基本写法:继续运行 continue [c] [<忽略次数>]

# 继续执行到下一断点
(gdb) c

基本写法:执行到指定行 until [u] [<行号>]

# 运行直到大于当前行号
(gdb) until 50

基本写法:跳出当前函数 finish

# 执行到函数返回并停止
(gdb) finish

基本写法:终止程序 kill [k]

# 终止当前调试的程序
(gdb) kill

断点管理

基本写法:设置行断点 break [b] <位置>

# 在指定行或函数处设置断点
(gdb) b main.c:42
(gdb) b main

基本写法:条件断点 break <位置> if <条件>

# 仅当条件为真时中断
(gdb) b main.c:50 if i == 100

基本写法:查看断点 info breakpoints [i b]

# 列出所有断点与编号
(gdb) info b

基本写法:删除断点 delete [d] [<编号>]

# 删除指定编号断点,无编号则全删
(gdb) delete 2

基本写法:禁用断点 disable [<编号>]

# 临时禁用断点不触发
(gdb) disable 1

基本写法:启用断点 enable [<编号>]

# 重新启用已禁用的断点
(gdb) enable 1

基本写法:忽略断点若干次 ignore <编号> <次数>

# 跳过断点前 N 次触发
(gdb) ignore 1 10

基本写法:临时断点 tbreak <位置>

# 一次性断点,触发后自动删除
(gdb) tbreak main.c:30

基本写法:监视点 watch <表达式>

# 表达式值变化时暂停
(gdb) watch counter

基本写法:捕获点 catch <事件>

# 捕获 throw、exec、fork 等事件
(gdb) catch throw

变量与表达式

基本写法:打印变量 print [p] <表达式>

# 输出变量或表达式的值
(gdb) p count
(gdb) p arr[0]

基本写法:打印数组 print *<指针>@<数量>

# 以数组形式打印连续内存
(gdb) p *arr@10

基本写法:按格式打印 print/<格式> <表达式>

# x 十六进制 d 十进制 c 字符 t 二进制 f 浮点
(gdb) p/x 255
(gdb) p/t flags

基本写法:自动显示 display <表达式>

# 每次停止自动打印该表达式
(gdb) display i

基本写法:取消自动显示 undisplay <编号>

# 移除 display 的自动打印项
(gdb) undisplay 1

基本写法:查看局部变量 info locals

# 列出当前函数所有局部变量
(gdb) info locals

基本写法:查看参数 info args

# 列出当前函数参数
(gdb) info args

基本写法:修改变量值 set var <变量> = <值>

# 运行时修改变量内容
(gdb) set var count = 0

查看内存

基本写法:检查内存 x/<数量><格式><单位> <地址>

# 按格式查看内存内容
# 格式:x d c s t;单位:b 字节 h 半字 w 字 g 双字
(gdb) x/16xb arr

基本写法:查看字符串 x/s <指针>

# 以 C 字符串形式查看内存
(gdb) x/s str

基本写法:查看内存地址 print &<变量>

# 输出变量地址
(gdb) p &count

调用栈

基本写法:查看调用栈 backtrace [bt] [<深度>]

# 显示函数调用栈
(gdb) bt

基本写法:切换栈帧 frame [f] <编号>

# 切换到指定栈帧
(gdb) frame 2

基本写法:向上切换 up [<数量>]

# 向调用者方向移动栈帧
(gdb) up

基本写法:向下切换 down [<数量>]

# 向被调用者方向移动栈帧
(gdb) down

基本写法:查看栈帧信息 info frame [f]

# 显示当前栈帧详细内容
(gdb) info frame

源码查看

基本写法:查看源码 list [l] [<位置>]

# 显示当前行附近源码
(gdb) list
(gdb) l main.c:30

基本写法:指定显示行数 set listsize <数量>

# 设置 list 默认显示行数
(gdb) set listsize 20

基本写法:向前查看 list -

# 显示当前源码之前的部分
(gdb) list -

基本写法:查看函数源码 list <函数名>

# 显示指定函数源码
(gdb) l do_work

多线程调试

基本写法:查看线程 info threads

# 列出所有线程及当前位置
(gdb) info threads

基本写法:切换线程 thread <编号>

# 切换到指定线程
(gdb) thread 3

基本写法:线程上设置断点 break <位置> thread <编号>

# 仅在指定线程触发断点
(gdb) b main.c:50 thread 2

基本写法:所有线程执行命令 thread apply all <命令>

# 对所有线程执行同一命令
(gdb) thread apply all bt

基本写法:锁调度器 set scheduler-locking on

# 仅当前线程执行,其他线程暂停
(gdb) set scheduler-locking on

汇编与寄存器

基本写法:查看寄存器 info registers [i r] [<名称>]

# 显示所有或指定寄存器
(gdb) info registers

基本写法:反汇编 disassemble [disas] [<范围>]

# 反汇编当前函数或指定地址范围
(gdb) disas main

基本写法:汇编级单步 stepi [si] / nexti [ni]

# 单步执行一条机器指令
(gdb) si

进阶功能

基本写法:执行命令序列 commands <断点编号>

# 断点触发时自动执行命令
(gdb) commands 1
> p count
> continue
> end

基本写法:调用函数 call <函数调用>

# 调试中调用程序内函数
(gdb) call sum(1, 2)

基本写法:导出 core 文件 generate-core-file <文件>

# 生成当前进程的 core 转储
(gdb) generate-core-file app.core

基本写法:记录会话 set logging on [file <文件>]

# 将 gdb 输出写入日志文件
(gdb) set logging on

基本写法:执行 shell 命令 shell <命令>

# 在 gdb 中执行系统命令
(gdb) shell ls

基本写法:加载调试脚本 source <脚本>

# 加载 gdb 命令脚本
(gdb) source mycmds.gdb

常用初始化

基本写法:.gdbinit 配置 ~/.gdbinit

# 启动时自动执行的配置文件
# 内容示例:
# set print pretty on
# set print array on
# set pagination off

基本写法:美化输出 set print pretty on

# 结构体打印时换行缩进
(gdb) set print pretty on

基本写法:关闭分页 set pagination off

# 长输出时不暂停分页
(gdb) set pagination off