调试前的准备
程序发布通常有两种模式:debug 和 release。
- Debug 模式:生成的可执行文件包含调试信息,方便程序员排查代码问题。
- Release 模式:剥离了调试信息,文件体积更小,但调试器几乎无法工作。
Linux 下的 gcc/g++ 默认生成的是 Release 版本。若要进行调试,必须在编译命令后加上 -g 选项:
gcc -o $@ $^ -g
启动与界面
开始调试前,确保系统已安装 gdb 或 cgdb,且待调试程序是 Debug 版本。
使用 gdb 命令行启动:
gdb 文件名
在 gdb 中,初始界面看不到源代码,需要输入 l (list) 相关命令查看:
l:显示源代码,每次 10 行。l 函数名/文件名:列出指定函数或文件的代码。l 文件名:行号:列出指定文件中某行附近的代码。
实际开发中,纯命令行操作略显繁琐。cgdb 作为 gdb 的前端增强版,能直接在屏幕显示代码,其他命令操作与 gdb 一致,体验更佳。
退出调试可使用 ctrl + d 或输入 quit。
核心调试命令
掌握几个基础命令就能覆盖大部分场景:
- 运行程序:
r(run)。从头开始执行,中途想重来再输一次r即可。 - 设置断点:
b [文件名:] 行号。在指定位置打断程序。 - 查看断点:
info b。列出当前所有断点及其序号。 - 删除断点:
d删除全部;d 断点序号删除指定断点(注意是序号而非行号)。 - 继续执行:
c(continue)。从当前位置跑到下一个断点。 - 单步跳过:
n(next)。逐行执行,遇到函数不进入内部。 - 单步进入:
s(step)。逐行执行,遇到函数会进入内部。 - 函数返回:
f(finish)。执行到当前函数结束。 - 跳到指定行:
until 行号。
提示:在 gdb/cgdb 中直接回车会自动重复上一条命令。
变量监控
调试时观察变量值至关重要:
- 打印值:
p 变量/表达式。即时查看变量状态。 - 修改变量:
set var 变量 = 值。运行时动态修改变量值。 - 持续显示:
display 变量。程序每停一次就自动打印该变量。 - 取消显示:
undisplay 变量序号。 - 监视变化:。当变量值在运行期间发生变化时自动暂停。常用于检查不该被修改的变量是否意外变动。


