目录
一、前言
cgdb和gdb的关系
核心区别:界面与交互方式
二、准备工作
1.安装cgdb
第一步:启用 CRB 仓库并安装基础依赖
第二步:编译升级 Autoconf(解决版本过低报错)
第三步:获取 cgdb 源码并编译安装
第四步:验证安装
2.release版本&&debug版本
1.是什么?
2.如何生成生成 Debug 版本的程序
3.调试代码样例
三、常用指令
1.进入调试
2.退出调试
3.代码查看命令
4. 程序执行与流程控制(控制代码怎么跑)
until的使用——常用于跳出循环
5. 断点管理(决定在哪里停下)
断点使能:disable&&enable
6.变量与表达式查看(查看运行状态)
7. 上下文与栈帧查看(理清函数调用逻辑)
四、让你开挂的调试技巧
1.watch
基本用法
观察点使能disable&&enable
2.set var
基本语法
3.条件断点
是什么?
基本语法
五、小结
一、前言
cgdb和gdb的关系
cgdb 和 gdb 的关系,可以理解为 “同一个引擎的两种驾驶舱”。gdb 是功能强大的原始引擎,而 cgdb 是为它配备了一块可视化仪表盘的前端界面。
核心区别:界面与交互方式
两者在调试功能(设断点、单步、查看变量等)上完全一致,因为 cgdb 的核心就是直接调用 gdb 来工作。根本区别在于信息呈现和操作交互。
·GDB (GNU Debugger):是纯命令行工具。调试时,你需要依靠 list 等命令来“盲猜”或回忆代码位置,代码和调试指令在同一个屏幕上交替显示,来回切换时容易产生割裂感。
·CGDB (Curses GDB):利用 curses 库创建了一个分屏界面。它将终端一分为二:
上方源码窗口:实时高亮显示当前正在执行的源代码行。
下方 GDB 窗口:与标准 gdb 完全相同的命令行交互区。
这种设计让你在输入调试命令的同时,能立即看到程序在源码上的流动轨迹,实现了“所调即所见”。
| 本质 | 核心调试器,功能全集 | GDB 的可视化前端 |
| 界面 | 单一命令行流 | 上下分屏(源码+GDB) |
| 核心优势 | 通用、无依赖、远程调试基石 | 直观、高效、降低认知负荷 |
| 适用场景 | 远程SSH无图形环境、脚本自动化、习惯纯命令流 | 本地或终端环境下的日常开发、源码阅读 |
选择建议:在日常的 C/C++ 开发中,优先使用 cgdb 能获得更好的体验和效率。但 gdb 作为底层核心,其命令必须掌握,因为 cgdb 中使用的正是同一套命令。两者是共生关系,而非替代关系。
所以本文直接以最常用的调试器cgdb为例,向大家介绍它的常见指令和开挂快捷操作!
二、准备工作
1.安装cgdb
默认情况下,Centos或Ubuntu系统默认自带gdb,而cgdb则需要用户自己下载。
下载gdb命令行:
sudo yum install -y gdb
下载cgdb命令行:
-
CentOS / RedHat 系列: 直接安装的命令是 sudo yum install -y cgdb。
-
注意:如果提示找不到软件包,可能需要先安装 EPEL 源,执行 sudo yum install -y epel-release,然后再试一次上面的安装命令。
-
-
Ubuntu / Debian 系列: 安装命令是 sudo apt-get update 然后 sudo apt-get install -y cgdb
博主帮你梳理了 CentOS Stream 10 源码编译安装 cgdb 的完整无痛流程。你可以直接按顺序复制执行:
第一步:启用 CRB 仓库并安装基础依赖
# 启用 CRB 仓库
sudo dnf config-manager –set-enabled crb
# 安装所有必需的编译依赖
sudo yum install -y git gcc gcc-c++ make autoconf automake flex texinfo ncurses-devel readline-devel wget
第二步:编译升级 Autoconf(解决版本过低报错)
# 下载、解压并安装 Autoconf 2.72
wget https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
tar -zxvf autoconf-2.72.tar.gz
cd autoconf-2.72
./configure && make && sudo make install
# 返回上一级目录
cd ..
第三步:获取 cgdb 源码并编译安装
# 克隆源码
git clone https://github.com/cgdb/cgdb.git
cd cgdb
# 生成配置、编译并安装
./autogen.sh
./configure
make
sudo make install
第四步:验证安装
cgdb –version
如果终端输出了 CGDB Version x.x.x,说明安装完成,可以直接使用 cgdb 你的程序名 来调试了。
2.release版本&&debug版本
1.是什么?
程序的版本发布分为 release 和 debug 版本,debug 一般是工程师开发时的自测版本,release 则是相对完善的发布版,一般给真正的用户和软件测试人员使用。gcc/g++ 编译源代码形成的可执行文件(二进制程序),默认情况下是不带调试信息的,也就是类似于 release 版本。但在实际开发中,我们可以通过添加特定的编译选项,来控制生成的是 debug 版本还是 release 版本。
2.如何生成生成 Debug 版本的程序
必须加上 -g 选项,-g 告诉编译器在生成的可执行文件中保留调试信息(如变量名、函数名、源文件行号等)。没有这个选项,cgdb 或 gdb 将无法看到源码和变量,只能看到内存地址和汇编指令。
gcc -g test.c -o test_debug

上图test是默认生成的release版本,test-d则是使用- g选项生成的debug版本。
容易看出debug版本的文件大小确实比release版本的文件大小大一些。这就是debug版本保留的调试信息!
3.调试代码样例
在test.c里写一段1-100求和的代码:
[tmx@my-alicloud testcgdb]$ vim test.c
#include<stdio.h>
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\\n", start, end, n);
return 0;
}
三、常用指令
1.进入调试
cgdb binFile
[tmx@my-alicloud testcgdb]$ cgdb test-d
2.退出调试
ctrl + d 或 quit 调试命令
3.代码查看命令
| list/l | 显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
| list/l 函数名 | 列出指定函数的源代码 | list/l main |
| list/l 文件名:行号 | 列出指定文件的源代码 | list/l mycmd.c:1 |
4. 程序执行与流程控制(控制代码怎么跑)
这一组命令用于控制程序的运行状态,是最常用的操作。
| r / run | 从程序开始连续执行 | run |
| n / next | 单步执行,不进入函数内部(逐过程,相当于 F10) | next |
| s / step | 单步执行,进入函数内部(逐语句,相当于 F11) | step |
| continue / c | 从当前位置开始连续执行程序,直到下一个断点或程序结束 | continue |
| finish | 执行到当前函数返回,然后停止(常用于跳出误入的函数) | finish |
| until 行号 | 执行到指定行号,常用于跳出循环 | until 20 |
until的使用——常用于跳出循环

5. 断点管理(决定在哪里停下)
断点是调试的核心,这一组用于设置、查看和取消断点。
| break / b [文件名:]行号 | 在指定行号设置断点 | break 10 或 break test.c:10 |
| break / b 函数名 | 在函数开头设置断点 | break main |
| info breakpoints / i b | 查看当前设置的所有断点列表及状态 | info breakpoints |
| delete / d breakpoints | 删除所有断点 | delete breakpoints |
| delete / d breakpoints n | 删除序号为 n 的断点 | delete breakpoints 1 |
| disable breakpoints | 禁用所有断点(保留但暂不生效) | disable breakpoints |
| enable breakpoints | 启用所有断点 | enable breakpoints |
(gdb) b15
Breakpoint 1 at 0x40117c: file test.c, line 15.
(gdb) b17
Breakpoint 2 at 0x401198: file test.c, line 17.
(gdb) bSum
Breakpoint 3 at 0x401140: file test.c, line 4.
(gdb) info b
Num Type Disp Enb Address What
1breakpoint keep y 0x000000000040117c in main at test.c:15
2breakpoint keep y 0x0000000000401198 in main at test.c:17
3breakpoint keep y 0x0000000000401140 in Sum at test.c:4
断点使能:disable&&enable
示例:取消Sum断点,观察情况


可以看到使用continue指令,直接跳过Sum函数,运行到下一个断点(第17行)。
示例:恢复Sum断点,使用continue指令,会再次进入Sum函数:

6.变量与表达式查看(查看运行状态)
停留在断点处时,用于检查数据的状态。
| print / p 表达式 | 打印表达式的值 | print start+end |
| p 变量名 | 打印指定变量的当前值 | p x |
| set var 变量=值 | 动态修改变量的值(用于测试特定分支) | set var i=10 |
| display 变量名 | 跟踪显示指定变量的值(每次程序停下都会自动打印) | display x |
| undisplay 编号 | 取消对指定编号的变量的跟踪显示 | undisplay 1 |
7. 上下文与栈帧查看(理清函数调用逻辑)
当程序崩溃(如段错误)或停在断点时,用于查看函数调用关系。
| backtrace / bt | 查看当前执行栈的各级函数调用及参数(排查崩溃非常有用) | backtrace |
| info locals / i locals | 查看当前栈帧的局部变量值 | info locals |
四、让你开挂的调试技巧
1.watch
在实际开发中,我们经常遇到这样的 Bug:一个变量突然变成了奇怪的值(比如 0 变成了 100,或者指针突然变成了 0x0 导致段错误),但你不知道是在哪一行、被哪个函数偷偷改掉的。一步步 next 单步调试去排查,无异于大海捞针。
这时候 watch 就派上用场了:你只要告诉 GDB 盯住这个变量,程序只要一碰它,就会自动停下来。
基本用法
监视变量变化
watch 变量名

观察点使能disable&&enable

2.set var
核心作用:动态修改变量的值
在程序暂停(遇到断点)时,你可以使用 set var 强行修改内存中某个变量的值,而不需要去修改源代码并重新编译。
基本语法
set var 变量名=新值

3.条件断点
是什么?
只有满足特定条件时,程序才会暂停。
基本语法
设置断点
break 行号或函数 if 条件表达式
# 例:break 7 if i == 10
已有断点追加条件
condition 断点编号 条件表达式

五、小结
本文详细介绍了 Linux 环境下 C/C++ 开发的核心调试工具 CGDB。作为 GDB 的可视化前端,CGDB 通过上下分屏直观展示源码与执行流,极大提升了调试体验。文章涵盖了从源码编译安装、Debug 与 Release 版本的区别,到常用调试指令的系统梳理。此外,重点分享了 watch 变量追踪、set var 动态赋值以及条件断点等进阶技巧。掌握这些核心操作,能帮助开发者更高效地定位并解决代码中的复杂 Bug。
至此,LInux系统基础开发工具我们就学完了,下一篇我们进入LInux系统编程的正题——进程。
创作不易,请读者一键三连,愿大家事事顺心!
