Linux下调试器gdb/cgdb的使用
目录
1.gdb如何进入调试界面
2.gdb的一些指令
编辑编辑
3.调试技巧
1.watch
2.set var
条件断点
CGDB 介绍:Linux 下的强大调试工具
1. CGDB 的主要特点
2. 安装 CGDB
在 Ubuntu/Debian 上安装
在 CentOS/RHEL 上安装
在 macOS 上安装(使用 Homebrew)
3. 基本使用方法
启动 CGDB
CGDB 界面布局
4. 常用调试命令
基本调试命令(与 GDB 相同)
CGDB 特有操作
5. 示例调试过程
调试示例程序 test.c
编译并调试
调试步骤
6. 高级功能
7. 与 GDB 的区别
8. 总结
1.gdb如何进入调试界面
gdb是一款代码调试的工具,在vscode2022下,我们可以对我们的代码进行调试,发现问题所在,同样的,这么好用的功能在Linux下也不可避免被频繁使用。
首先我们调试的目的是要查找问题。
如果我们在Linux下写一个文件,直接gcc,然后用gdb打开它会无法调试。
这是因为我们的代码有2个版本一个是debug版本,一个是release版本,只有在debug版本下我们才可以进行调试,而gcc默认会将文件发布成release版本,这个时候我们就需要加上-g选项指定gcc将我们的文件编译为debug版本。这个时候我们就可以进入我们的调试界面了
2.gdb的一些指令
vs我们进行编译我们有一些快捷键,比如打断点,逐过程,逐语句,我们的Linux也有一些指令进行这些操作帮助我们进行问题的查找。
首先b+行号是打断点,b 9就是给弟9行打断点。我们这里b 18给在第18行的代码打上断点,这个时候它的行标就会变色。
同时我们也支持查看我们设置了哪些断点
info b是查断点。
同时我们打断点,查断点,也要支持我们对断点进行删除。
这里我们查看断点时我们可以看到最左边有对断点的编号,我们需要d+断点编号对断点进行删除。
这里我们d 2就对我们第二个断点进行了删除。
同时我们也支持删除所有的断点,d breakpoints是删除所有的断点。
我们调试时如果想让代码跑起来就需要r指令。这个会让我们程序从开始连续执行直到断点处。
这里我们有几个细节需要注意:
细节1:gdb启动调试的时候,只是开启了gdb,被调试的程序并没有运行起来。
细节2:r/run,表示的是在gdb的场景下,启动我们自己的mmycmd程序。
细节3:在没有断点的情况下,r/run就是让我们的程序直接运行直到结束。
细节4:断点的本质功能:让我们的程序,在运行到指定的行,进行暂停
r相当于我们vs2022里的F5,进行程序运行。
我们也支持逐过程,n是逐过程,单步执行,不进入函数内部,相当于F10。
逐语句:s,单步执行,进入函数的内部,相当于F11.
vs下我们支持监视窗口对某个变量值的查看,我们Linux下必须也支持啊!
我们p+变量名就是查看该变量的值,但是这个p只能查看一次,我们vs下监视窗口的变量值是常显示的,我们想让某个变量常显示,就需要 display i进行常显示。
undisplay i 就是对某个值取消常显示,但是注意这个i是编号,而非变量名。
在VS下我们的F5是从一个断点跑到另一个断点,我们的Linux也必须支持这个功能啊!
我们Linux下按c就是从当前位置开始连续执行程序直到程序结束或者运行到下一个断点。
如果我们进入到一个函数但是我们后悔了该怎么办?vs下直接跳转到该行。
我们Linux就得使用finish来执行到当前函数返回然后停止
总而言之,我们使工具进行debug的本质是借助工具帮助我们找到问题所在。
而不是解决问题,解决问题是人或者AI去解决的。
我们在查找的时候也有一定的技巧,我们学过二分查找,这个算法效率比较高,所以我们在实际项目中也可以使用这个算法来进行问题的定位,以断点的方式进行,找到问题的思路,这种一般是在非常复杂的问题我们才搞这个,我们写个100行左右的代码没必要使用这样的方式。当然如果要用也是可以的。
下面继续介绍一些命令:
bt 查看函数调用的堆栈结构
info i查看当前debug的程序信息
info local 查看当前函数内的临时变量
我们的断点是可以被禁用的,是为了保留我们懂得调试痕迹,防止问题再次出现。
禁用断点是:
disable 编号
能禁用我们就要启用,这个时候是
enable 编号
3.调试技巧
1.watch

2.set var

条件断点

CGDB 介绍:Linux 下的强大调试工具
CGDB(Curses-based GNU Debugger) 是一个基于 GDB(GNU Debugger) 的增强版调试工具,它在终端环境下提供了类似 图形界面 的调试体验。CGDB 使用 ncurses 库实现了分屏界面,上方显示源代码,下方是 GDB 命令行,使得调试更加直观和高效。
1. CGDB 的主要特点
-
分屏界面:上方显示源代码,下方是 GDB 命令行,方便查看代码和执行调试命令。
-
语法高亮:支持代码高亮,提高可读性。
-
快捷键操作:类似 Vim 的快捷键(支持
hjkl
移动),提高调试效率。 -
完全兼容 GDB:所有 GDB 命令都可以在 CGDB 中使用。
-
轻量级:纯终端运行,不需要 GUI 环境,适合远程 SSH 调试。
2. 安装 CGDB
在 Ubuntu/Debian 上安装
bash
sudo apt update sudo apt install cgdb
在 CentOS/RHEL 上安装
bash
sudo yum install epel-release # 如果未安装 EPEL 仓库 sudo yum install cgdb
在 macOS 上安装(使用 Homebrew)
bash
brew install cgdb
3. 基本使用方法
启动 CGDB
bash
cgdb <可执行程序> # 直接调试程序 cgdb -p <PID> # 附加到正在运行的进程
CGDB 界面布局
text
+----------------------------------+ | 源代码窗口(可浏览和设置断点) | | | | | | | +----------------------------------+ | GDB 命令窗口(输入调试命令) | +----------------------------------+
-
Esc
:切换到源代码窗口(可浏览代码) -
i
:切换到 GDB 命令窗口(输入调试命令)
4. 常用调试命令
基本调试命令(与 GDB 相同)
命令 | 说明 |
---|---|
break <行号/函数名> | 设置断点 |
run | 启动程序 |
next (n ) | 单步执行(不进入函数) |
step (s ) | 单步执行(进入函数) |
continue (c ) | 继续执行直到下一个断点 |
print <变量> (p ) | 打印变量值 |
backtrace (bt ) | 查看调用栈 |
quit (q ) | 退出调试 |
CGDB 特有操作
快捷键 | 说明 |
---|---|
Esc | 进入源代码窗口 |
i | 进入 GDB 命令窗口 |
Space | 在源代码窗口设置/取消断点 |
/ | 在源代码窗口搜索 |
o | 在 GDB 窗口切换布局(水平/垂直) |
5. 示例调试过程
调试示例程序 test.c
c
#include <stdio.h>int main() {int a = 10;int b = 20;int sum = a + b;printf("Sum: %d\n", sum);return 0; }
编译并调试
bash
gcc -g test.c -o test # 编译时加上 -g 选项生成调试信息 cgdb ./test # 启动 CGDB
调试步骤
-
在
main
函数处设置断点:-
按
Esc
进入源代码窗口,移动光标到int a = 10;
行,按Space
设置断点。
-
-
按
i
进入 GDB 命令窗口,输入run
运行程序。 -
单步执行:
-
n
(next
)执行下一行,不进入函数。 -
s
(step
)进入函数(如printf
)。
-
-
查看变量:
-
p a
打印变量a
的值。
-
-
继续执行:
-
c
(continue
)直到程序结束。
-
6. 高级功能
-
多窗口布局:支持水平/垂直分屏(
o
切换)。 -
TUI 模式:类似 GDB 的 TUI 模式,但更友好。
-
自定义配置:
-
配置文件
~/.cgdb/cgdbrc
可以设置快捷键和主题。
-
7. 与 GDB 的区别
特性 | CGDB | GDB |
---|---|---|
界面 | 分屏(代码+GDB) | 纯命令行 |
快捷键 | Vim 风格 | 需自定义 |
代码浏览 | 直接查看 | 需 list 命令 |
易用性 | 更高 | 较低 |
8. 总结
-
CGDB 适合:
-
喜欢终端调试但想要更直观界面的开发者。
-
需要快速查看代码并设置断点的场景。
-
-
GDB 适合:
-
纯命令行环境,或需要脚本化调试时。
-
CGDB 结合了 GDB 的强大功能和 TUI 的便捷性,是 Linux 下 C/C++ 调试的高效工具!