一、 Debug 与 Release
Linux 下 GCC 编译出的程序默认是 Release(发布版),不包含调试信息。如果我们需要使用 GDB 进行调试,必须在编译时加上-g选项:
gcc test.c -o test -gGDB(GNU Debugger)通过保留源码的符号表信息,允许我们在程序运行时查看内部变量状态和调用栈。
二、 核心指令速查表
在终端输入gdb 程序名即可进入调试界面。常用指令如下:
l(list):查看源代码。b 行号/函数名(break):设置断点。r(run):运行程序。n(next):逐过程单步执行(不进入函数内部)。s(step):逐语句单步执行(会进入函数内部)。p 变量名(print):打印变量的当前值。c(continue):继续执行到下一个断点。info b:查看所有断点信息。q(quit):退出调试。
三、 实战演示:调试一个加法函数
# 进入 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++ 底层原理的必备技能。
自我实战操作
实战路径:统一在代码大本营下建立新项目。
# 1. 进入代码库大本营,创建 GDB 测试目录 cd ~/linux_study mkdir gdb_test cd gdb_test # 2. 编写测试代码 vim test.c(输入以下代码,保存退出)
#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:编译与启动
# 1. 务必加上 -g 选项! gcc test.c -o test -g # 2. 启动 GDB gdb ./test(此时进入了(gdb)提示符界面)
# 需要提前下载gdb sudo apt install -y gdb实战 2:看代码、打断点、运行
# 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 的区别)
# 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,上面是代码,下面是调试台)