GDB 调试指南(第 5 章):命令速查与常见误区
← 上一章:单步调试与查看程序状态 | 目录
第 5 章 命令速查与常见误区
这一章是全书的“复习页”:把前四章出现过的命令汇总成一张速查表,再把容易弄错的点集中列一遍。建议先通读一遍前四章再来看这里,当纯速查表效果最好;如果你是直接跳过来的,建议先看第 1 章建立基本概念。
5.1 命令缩写速查表
原笔记的缩写表有三处错误(
watch、finish、return),下表已经修正,详见 5.3 节。
| 命令格式 | 缩写 | 简介 | 详见 |
|---|---|---|---|
break [file:]function |
b |
在(指定文件的)函数/行上设置断点 | 第 2 章 |
tbreak |
tb |
一次性断点,命中后自动删除 | 第 2 章 |
rbreak |
无 | 按正则表达式批量下断点 | 第 2 章 |
watch |
无固定缩写 | 监视变量/表达式值的变化(需输入完整单词,或靠前缀唯一匹配) | 第 2 章 |
info breakpoints |
i b |
查看所有断点/观察点 | 第 2 章 |
delete |
d |
删除断点 | 第 2 章 |
clear [位置] |
无 | 按源码位置删除断点 | 第 2 章 |
disable / enable |
无 | 禁用 / 启用断点 | 第 2 章 |
run [arglist] |
r |
运行程序(若指定 arglist,则作为命令行参数) |
第 3 章 |
set args |
无 | 预设命令行参数,供 run 使用 |
第 3 章 |
show args |
无 | 查看当前预设的参数 | 第 3 章 |
set environment |
无 | 设置环境变量 | 第 3 章 |
continue |
c |
从断点等暂停处继续运行 | 第 1 章 |
next |
n |
单步执行,不进入函数内部 | 第 4 章 |
step |
s |
单步执行,会进入函数内部 | 第 4 章 |
nexti |
ni |
单步一条指令,不进入函数 | 第 4 章 |
stepi |
si |
单步一条指令,进入函数 | 第 4 章 |
finish |
fin |
执行到当前函数返回为止 | 第 4 章 |
until |
u |
跑完当前循环的剩余部分 | 第 4 章 |
print |
p |
打印表达式的值 | 第 4 章 |
backtrace |
bt |
查看调用栈 | 第 4 章 |
frame |
f |
切换到调用栈的某一层 | 第 4 章 |
up / down |
无 | 在调用栈中相对上/下移动一层 | 第 4 章 |
list |
l |
列出源代码片段 | 见下 |
return |
无固定缩写 | 强制让当前函数立即返回 | — |
shell |
! |
不退出 GDB 执行一条 Shell 命令(如 !ls) |
— |
quit |
q |
退出 GDB | — |
【新手提示】GDB 的缩写规则是“只要输入的前缀在当前上下文中唯一,就能被识别”,并不是每个命令都有一个官方单字母缩写。注意表里
frame的缩写是f,这个字母不能再给别的命令用(比如下面勘误里提到的finish就不能用f)。遇到不确定的命令,直接敲全称最保险,或用help <command>查询。
5.2 list 相关命令
| 命令 | 作用 |
|---|---|
list 1 |
从第 1 行开始显示 |
list - |
显示上一页 |
list + |
显示下一页 |
set listsize 30 |
设置每次 list 显示的行数为 30 |
show listsize |
显示当前设置的 list 行数 |
5.3 常见误区汇总
整理过程中发现原笔记里几处与 GDB 实际行为不符、或容易让新手误解的地方,统一列在这里:
| 位置 | 容易出现的误解 | 正确理解 |
|---|---|---|
| 命令缩写 | 以为 watch 缩写是 / |
/ 实际用于 print/x 等命令的格式说明符(如 p/x、x/4xb),和命令缩写是完全不同的语法位置;watch 没有固定单字母缩写 |
| 命令缩写 | 以为 finish 缩写是 f |
f 在 GDB 中是 frame 的缩写,会冲突;finish 常用缩写是 fin |
| 命令缩写 | 以为 return 缩写是 r |
r 已经是 run 的缩写;return 没有固定单字母缩写,建议直接打全称 |
list/show listsize |
以为 show listsize 是“显示行号” |
实际作用是显示当前设置的 list 单次显示行数,和源码行号无关 |
| 单步执行(第 4 章) | 以为 stepi 和 nexti 效果完全一样 |
只在当前指令不是 call 时才一样;遇到函数调用,nexti 跳过、stepi 进入,和 next/step 的关系完全对应 |
| 运行与参数(第 3 章) | 以为 run 和 continue 都是“接着往下跑” |
run 是从头重新开始,continue 才是从暂停处继续;按错会导致之前累积的状态全部丢失 |
| 断点触发(第 2 章) | 断点明明下了却不触发,怀疑 GDB 坏了 | 多半是开了编译优化(-O2)导致函数被内联、或者忘记重新编译导致二进制和源码不一致,调试阶段建议用 -O0 |
5.4 继续往下学什么
这份笔记覆盖的是日常调试里出现频率最高的一批命令,足够应付绝大多数场景。如果想继续深入,可以按需了解下面这些方向(这里只给方向,不展开):
- 多线程调试:
info threads、thread <编号>切换线程,break ... thread <编号>只在特定线程触发断点; - TUI 模式:
gdb -tui或会话中按Ctrl-X A,可以在终端里同时看到源码、汇编、寄存器窗口,适合喜欢可视化的场景; - core dump 分析:程序崩溃后系统生成的 core 文件,可以用
gdb ./cmd core事后分析崩溃现场,不需要当场复现; .gdbinit自定义:把常用的断点、别名、显示格式写进启动脚本,减少重复操作;- 条件断点进阶:
ignore <编号> <次数>让断点跳过前 N 次命中,适合“只关心第 1000 次循环”这种场景,效果上是b 位置 if 条件的补充。
5.5 小结
这本笔记从“带调试信息编译”讲到“断点与观察点”“运行参数”“单步与状态查看”,构成了日常调试的完整闭环。遇到具体问题时,先想清楚自己是要“在哪里停下”(断点/观察点)还是“看清楚此刻发生了什么”(print/backtrace),再去对应章节找命令,会比死记命令表更容易用起来。
← 上一章:单步调试与查看程序状态 | 目录

浙公网安备 33010602011771号