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

相关推荐
饿了吃洗衣凝珠1 小时前
red hat day2
linux·运维·服务器
天南散修2 小时前
《802.11-2024》第08讲 · 聚合与块确认:把「一次一帧」变成「一次一批」
linux·网络·wifi·802.11
Source.Liu2 小时前
【A11】服务器数据库结构笔记
服务器·数据库·笔记
AI职业加油站2 小时前
模数共振行动解读|大模型应用工程师证书,匹配行业 RAG/Agent 落地人才需求
人工智能·学习·算法·职场和发展·职场发展
Dxy12393102162 小时前
Linux 服务器 vi 命令怎么使用
linux·运维·服务器
叼烟扛炮2 小时前
Linux 学习笔记(十五):进程的魔法 fork 与 僵尸孤儿
linux·运维·服务器
SZleoWang2 小时前
费曼学习法的4个步骤:选概念、教别人、找缺口、再简化
学习
1314lay_10073 小时前
ABAP 读取服务器的文件 OPEN DATASET,READ DATASET f_filepath INTO l_file.
经验分享·笔记
MichaelJohn3 小时前
我用 Obsidian + Claude Code + GitHub 搭了个真正「会生长」的第二大脑
笔记