Cgdb

cgdb 是 GDB 的一个轻量级前端,它在终端中提供了一个分屏界面:上半部分显示代码(类似 Vim),下半部分是 GDB 命令窗口。

使用 cgdb 调试 C 程序时,指令分为两类:CGDB 界面快捷键(操作源代码窗口)和 GDB 原生指令(操作命令窗口)。

0. 准备工作

在编译代码时,必须加上 -g 选项,否则无法调试。

1
2
gcc -g main.c -o main
cgdb ./main

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. 常用调试流程示例

  1. 启动cgdb ./my_program
  2. 设断点:按 i 确保在 GDB 模式,输入 b main;或者按 ESC,移动光标到某一行,按 Space
  3. 运行:按 i 回到命令窗口,输入 r
  4. 单步:程序停下后,输入 n 下一行,或 s 进函数。
  5. 观察:发现某变量 cnt 只有,输入 p cnt 查看值。
  6. 修正:如果发现逻辑错误,按 q 退出,修改代码,重新编译。

技巧

  • 回车键:在 GDB 模式下,直接按回车会重复执行上一条指令(例如一直按回车等于一直 n)。
  • Tab 补全:GDB 命令支持自动补全函数名和变量名。
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy