1. GDB入门:GDB是什么、GDB能做什么、GDB的安装与启动、第一个调试案例
1.1 GDB到底是什么?
GDB,全称GNU Debugger。说白了,就是一个让你能“看穿”程序运行过程的工具。
我刚开始做嵌入式开发那会儿,调试全靠printf。满屏打印信息,改一行代码编译一次,效率低得让人抓狂。后来老同事甩给我一句:“别折腾了,学学GDB吧。” 嗯,从那以后,我再也没回头写过printf调试。
GDB能让你在程序运行时随时“暂停”,看看变量值对不对、函数调用链正不正常、内存有没有越界。它就像给程序装了个显微镜,哪里有问题,放大哪里。
1.2 GDB能做什么?
我总结了一下,GDB的核心能力就这几点:
- 设置断点:让程序在指定行停下来。你可以观察那一刻的所有状态。
- 单步执行:一行一行地跑代码。看看程序到底走了哪条分支。
- 查看变量:随时打印变量的值。甚至能修改它,看看后续影响。
- 查看堆栈:程序崩溃了?看看是谁调了谁,一路回溯到根因。
- 分析内存:检查指针指向的内容,排查野指针、内存泄漏。
- 多线程/多进程调试:切换线程、加锁分析,定位并发问题。
一句话总结:GDB就是程序员的“后悔药”和“透视镜”。
1.3 安装与启动
安装GDB其实很简单。不同平台略有差异,我列个表给你看:
| 操作系统 | 安装命令 |
|---|---|
| Ubuntu/Debian | sudo apt-get install gdb |
| CentOS/RHEL | sudo yum install gdb |
| macOS (Homebrew) | brew install gdb |
| Windows (MinGW) | 下载MinGW安装包,勾选gdb组件 |
装完之后,在终端敲 gdb --version,能看到版本号就说明成功了。
启动GDB有两种方式:
- 直接启动:
gdb ./your_program - 先启动再加载:
gdb进入交互模式,然后输入file ./your_program
小技巧:我个人习惯用第一种方式。一步到位,省事。
1.4 第一个调试案例
光说不练假把式。我们写个简单的C程序来试试手。
先创建一个文件 hello.c:
#include <stdio.h>
int add(int a, int b) {
int result = a + b;
return result;
}
int main() {
int x = 10;
int y = 20;
int sum = add(x, y);
printf("sum = %d\n", sum);
return 0;
}
编译时记得加 -g 选项,这样才能保留调试信息:
gcc -g -o hello hello.c
然后启动GDB:
gdb ./hello
进入GDB交互界面后,我们来走一遍基本流程:
- 设置断点:
break main—— 在main函数入口停下。 - 运行程序:
run—— 程序会在main处暂停。 - 单步执行:
next—— 执行下一行代码。 - 打印变量:
print x—— 看看x的值是多少。 - 进入函数:
step—— 进入add函数内部。 - 查看堆栈:
backtrace—— 看看当前在哪个函数里。 - 继续运行:
continue—— 让程序跑完。
实际操作一下,你会发现:
- 执行
print x时,GDB会告诉你$1 = 10。 - 执行
step进入add后,print result能看到$2 = 30。 - 执行
backtrace会显示#0 add ... #1 main ...,调用关系一目了然。
注意:我曾经犯过一个低级错误——编译时忘了加 -g。结果GDB启动后,断点打不上,变量也看不了。折腾了半天才发现问题。所以,编译时务必加 -g,这是GDB能工作的前提。
1.5 本章知识体系
为了让你更直观地理解本章内容,我画了一张图:
这张图把本章的核心知识点串起来了。你顺着看一遍,心里就有谱了。
1.6 写在最后
GDB入门其实不难。你只要记住三件事:
- 编译加
-g - 会用
break、run、next、print这四个命令 - 遇到问题别慌,
backtrace能帮你找到回家的路
剩下的,就是在实战中慢慢积累了。我当年也是从这几个命令开始,一步步走到今天的。你也能行。
可可精品资料库