cgdb 是 GDB 的一个轻量级前端,它在终端中提供了一个分屏界面:上半部分显示代码(类似 Vim),下半部分是 GDB 命令窗口。
使用 cgdb 调试 C 程序时,指令分为两类:CGDB 界面快捷键(操作源代码窗口)和 GDB 原生指令(操作命令窗口)。
0. 准备工作
在编译代码时,必须加上 -g 选项,否则无法调试。
|
|
1. 核心概念:模式切换 (Mode Switching)
这是新手最容易混淆的地方:
- CGDB 模式 (代码窗口):按下
ESC键。此时你可以像用 Vim 一样浏览代码。 - GDB 模式 (命令窗口):按下
i键 (insert)。此时你可以输入run,next等调试命令。
2. CGDB 界面快捷键 (需在 ESC 模式下)
当你在代码窗口时(按 ESC 后),可以使用以下快捷键:
| 按键 | 功能 | 备注 |
|---|---|---|
Space |
设置/取消断点 | 光标所在行切换断点(最常用) |
k / j |
上/下移动光标 | 同 Vim |
/ |
搜索代码内容 | 同 Vim,输入关键字回车 |
n |
查找下一个匹配项 | 同 Vim |
gg / G |
跳到文件头 / 文件尾 | 同 Vim |
:15 |
跳到第 15 行 | Vim 风格跳转 |
o |
打开文件选择器 | 当有多个源文件时切换文件 |
- |
缩小代码窗口 | 调整分屏比例 |
+ |
增大代码窗口 | 调整分屏比例 |
Ctrl + w |
切换屏幕焦点 | 也可以直接按 i 进下屏,ESC 进上屏 |
3. GDB 常用指令 (需在 i 模式下)
当你在命令窗口时(按 i 后),输入的指令与原生 GDB 完全一致。
3.1 运行与停止
r(run): 开始运行程序。如果有参数,跟在后面(如r arg1 arg2)。q(quit): 退出 cgdb。kill: 停止当前正在运行的程序。
3.2 断点管理 (Breakpoint)
b main: 在 main 函数入口打断点。b 20: 在第 20 行打断点。b file.c:15: 在 file.c 的第 15 行打断点。info b: 查看所有断点信息(编号、位置等)。d 1(delete): 删除编号为 1 的断点。d: 删除所有断点。
3.3 单步调试 (Stepping)
n(next): 单步执行(不进入函数内部)。s(step): 单步执行(进入函数内部)。c(continue): 继续运行,直到遇到下一个断点。finish: 执行直到当前函数返回(跳出函数)。until 50: 运行直到第 50 行。
3.4 查看变量与内存
p var(print): 打印变量var的值。p *ptr: 打印指针指向的值。p/x var: 以十六进制格式打印。display var: 每次停顿时自动显示var的值(监视)。info display: 查看当前的监视列表。undisplay 1: 取消编号为 1 的监视。ptype var: 查看变量类型。x/10dw array: 查看内存。x是 examine,查看array地址开始的 10 个十进制(d)字(w)。
3.5 查看堆栈
bt(backtrace): 查看函数调用栈(程序崩了查 Core Dump 时最有用)。f 1(frame): 切换到栈帧 1(查看上层函数的变量上下文)。
4. 常用调试流程示例
- 启动:
cgdb ./my_program - 设断点:按
i确保在 GDB 模式,输入b main;或者按ESC,移动光标到某一行,按Space。 - 运行:按
i回到命令窗口,输入r。 - 单步:程序停下后,输入
n下一行,或s进函数。 - 观察:发现某变量
cnt只有,输入p cnt查看值。 - 修正:如果发现逻辑错误,按
q退出,修改代码,重新编译。
技巧
- 回车键:在 GDB 模式下,直接按回车会重复执行上一条指令(例如一直按回车等于一直
n)。 - Tab 补全:GDB 命令支持自动补全函数名和变量名。