一、调试前的预备知识
程序发布通常分为 debug 模式和 release 模式。debug 模式下生成的可执行文件包含调试信息,便于程序员排查代码;release 模式则剥离这些信息以减小体积,但也导致调试器无法工作。
Linux 下的 gcc/g++ 默认生成的是 release 版本,无法直接调试。编译时必须添加 -g 选项指定以 debug 方式发布:
gcc -g -o program source.c
二、gdb/cgdb 的使用
1. 启动与查看代码
开始调试前,确保系统已安装 gdb 或 cgdb,且待调试程序是 debug 版本。启动命令如下:
gdb program
进入 gdb 后,默认看不到源代码,需使用 l (list) 相关命令:
- 输入
l:显示当前上下文 10 行代码 - 输入
l 函数名/文件名:列出指定函数或文件的代码 - 输入
l 文件名:行号:列出指定位置附近的代码
实际开发中,手动滚动查看代码效率较低。cgdb 作为 gdb 的前端增强版,能直接在屏幕显示代码界面,操作逻辑与 gdb 一致,体验更佳。
退出调试可使用 Ctrl+D 或输入 quit。
2. 基础调试命令
掌握核心指令是调试的关键:
r(run):启动程序,中途可随时重头运行b [文件名:] 行号:在指定行设置断点info b:查看所有断点信息d:删除所有断点d 断点序号:删除指定序号的断点(注意不是行号)c(continue):从当前位置连续执行至下一个断点n(next):单步逐过程执行,遇到函数不进入内部s(step):单步逐语句执行,遇到函数会进入内部f(finish):执行完当前函数并返回until 行号:执行到指定行号
提示:在 gdb/cgdb 中直接回车会自动执行上一条命令。
3. 监视变量相关命令
观察变量值是调试中最常见的操作:
p 变量/表达式:打印变量或表达式的值set var 变量 = 值:运行时修改变量值display 变量:持续自动显示变量值undisplay 变量序号:取消对指定变量的持续追踪watch 变量:监控变量变化,一旦数值变动即暂停程序
watch 命令特别适用于怀疑某个不该被修改的变量被意外篡改的场景。
4. 设置条件断点
断点可以附加触发条件,避免不必要的中断:
b 位置 if 条件
例如 b 10 if i == 5,表示在第 10 行设断点,仅当 i 等于 5 时生效。
对于已存在的断点,也可通过 condition 添加条件:
condition 断点序号 条件


