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),再去对应章节找命令,会比死记命令表更容易用起来。


← 上一章:单步调试与查看程序状态 | 目录

posted @ 2026-10-10 08:27  BlackSnow  阅读(4)  评论(0)    收藏  举报