Linux 学习笔记(十三):高效排错利器——GDB 调试器入门

一、 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,上面是代码,下面是调试台)

相关推荐
lzx_00228 分钟前
Linux 进程(三) 从进程状态到僵尸进程、孤儿进程
linux·服务器
FlightYe2 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
刘马想放假3 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc4 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW4 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
柳鲲鹏5 小时前
内斗学概论:43、平级内斗
笔记
梦到啥说啥5 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
无足鸟ICT7 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风7 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
li星野8 小时前
相位补偿学习记录:把被颅骨“打乱“的声波重新对齐
学习