编译准备
在 Linux 环境下开发 C/C++ 程序,调试是必不可少的一环。程序发布通常分为 debug 和 release 两种模式。
- debug 模式:生成的可执行文件包含调试信息(Debug Symbols),便于定位问题。
- release 模式:剥离了调试信息,体积更小,但无法进行源码级调试。
默认情况下,gcc/g++ 生成的是 release 版本。若需调试,必须在编译命令后添加 -g 选项。例如:
gcc -o main main.c -g
如果是 Makefile 项目,记得在规则中加入 -g 参数。
启动与查看代码
开始调试前,请确认系统已安装 gdb 或 cgdb,且待调试程序带有调试符号。
启动方式
使用 gdb 启动时,直接指定可执行文件名即可:
gdb ./main
退出调试会话可以使用 ctrl + d 或输入 quit。
查看源代码
进入 gdb 后,默认看不到代码,需要使用 list 命令(简写 l):
l:显示当前上下文附近的 10 行代码。l 函数名:列出指定函数的代码。l 文件名:行号:从指定文件的某一行开始显示。
实际开发中,频繁手动输入 l 比较繁琐。cgdb 是 gdb 的增强前端,它直接在屏幕下方显示源代码窗口,操作逻辑与 gdb 完全一致,体验更直观。
基础调试命令
掌握几个核心指令,就能覆盖大部分调试场景。
- 运行程序:
run(简写r)。从头开始执行,中途可随时重跑。 - 设置断点:
break [文件名:]行号(简写b)。在指定位置暂停。 - 查看断点:
info breakpoints(简写info b)。列出所有断点及其状态。 - 删除断点:
delete(简写d) 删除全部;d 序号删除指定序号的断点。
注意:每个断点都有一个唯一的序号,删除时需指明该序号而非行号。
- 继续执行:
continue(简写c)。从当前位置跑到下一个断点。 - 单步跳过:
next(简写n)。执行下一行代码,遇到函数调用不进入内部。 - 单步进入:
step(简写s)。执行下一行代码,若为函数则进入其内部。 - 跳出函数:
finish(简写f)。执行完当前函数并返回。 - 跳到指定行:
until 行号。执行到指定行号处停止。
在 gdb/cgdb 中,直接回车通常会重复执行上一条命令,这能极大提升调试效率。


