一、 Debug 与 Release
Linux 下 GCC 编译出的程序默认是 Release(发布版),不包含调试信息。如果我们需要使用 GDB 进行调试,必须在编译时加上 -g 选项:
bash
gcc test.c -o test -g
GDB(GNU Debugger)通过保留源码的符号表信息,允许我们在程序运行时查看内部变量状态和调用栈。
二、 核心指令速查表
在终端输入 gdb 程序名 即可进入调试界面。常用指令如下:
-
l(list):查看源代码。 -
b 行号/函数名(break):设置断点。 -
r(run):运行程序。 -
n(next):逐过程单步执行(不进入函数内部)。 -
s(step):逐语句单步执行(会进入函数内部)。 -
p 变量名(print):打印变量的当前值。 -
c(continue):继续执行到下一个断点。 -
info b:查看所有断点信息。 -
q(quit):退出调试。
三、 实战演示:调试一个加法函数
bash
# 进入 GDB
gdb ./test
# 在 main 函数处打断点
(gdb) b main
# 运行
(gdb) r
# 执行下一步,遇到 add 函数时使用 s 进入
(gdb) n
(gdb) s
# 打印函数参数 a 和 b
(gdb) p a
# 直接跳转到下一个断点
(gdb) c
四、 进阶技巧
-
display 变量名:设置后,每次单步执行都会自动打印该变量(无需反复敲 p)。 -
watch 变量名:监视变量,一旦其值改变,程序会立刻暂停。适合排查"不知哪里把变量改错了"的 Bug。
总结
GDB 将程序的黑盒运行变成了白盒透明。熟练掌握 GDB,不仅能快速定位 Bug,更是阅读开源代码和深入学习 C/C++ 底层原理的必备技能。
自我实战操作
实战路径:统一在代码大本营下建立新项目。
bash
# 1. 进入代码库大本营,创建 GDB 测试目录
cd ~/linux_study
mkdir gdb_test
cd gdb_test
# 2. 编写测试代码
vim test.c
(输入以下代码,保存退出)
cpp
#include <stdio.h>
int add(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int x = 10;
int y = 20;
int result = add(x, y);
printf("Result is: %d\n", result);
return 0;
}
实战 1:编译与启动
bash
# 1. 务必加上 -g 选项!
gcc test.c -o test -g
# 2. 启动 GDB
gdb ./test
(此时进入了 (gdb) 提示符界面)
bash
# 需要提前下载gdb
sudo apt install -y gdb
实战 2:看代码、打断点、运行
cpp
# 1. 查看代码(小写 L)
(gdb) l
# 2. 给 main 函数打断点
(gdb) b main
# 3. 再给第 15 行(printf那里)打个断点
(gdb) b 15
# 4. 运行程序
(gdb) r
# 此时程序会停在 main 函数的第一行
# 5. 看看变量 x 现在是多少
(gdb) p x
\实战 3:单步调试(体验 n 和 s 的区别)
cpp
# 1. 连续敲 n(执行完 x=10, y=20, 来到调用 add 那一行)
(gdb) n
(gdb) n
(gdb) n
# 2. 此时停在了 int result = add(x, y); 这行
# 用 s 进入 add 函数内部
(gdb) s
# 3. 进入后,打印参数 a 和 b 的值
(gdb) p a
(gdb) p b
# 4. 继续往下走,直接跳到下一个断点(printf 那里)
(gdb) c
# 5. 看看 result 算出来没有
(gdb) p result
# 6. 退出
(gdb) q
(如果你想看图形化代码调试,可以 sudo apt install cgdb,然后输入 cgdb ./test,上面是代码,下面是调试台)


