一、GDB入门:GDB是什么、GDB能做什么、GDB的安装与基本启动
说实话,我刚开始做嵌入式开发那会儿,调试基本靠printf。代码里到处塞打印语句,编译、下载、看串口输出,改一行代码就得重复一遍流程。直到有一天,一个同事看我满头大汗地改bug,丢过来一句:「你试试GDB吧。」
嗯,从那以后,我再也没回到printf调试的老路上。
GDB是什么?
GDB,全称GNU Debugger,是GNU项目下的一个开源调试器。说白了,它就是一个能让你「钻进程序内部」看个究竟的工具。
你想想看,平时程序跑起来,你只能看到最终结果。如果结果不对,你只能靠猜。GDB不一样,它让你能在程序运行过程中随时停下来,查看变量的值、检查内存的内容、甚至修改程序的执行路径。
我个人习惯把GDB比作「程序的CT机」——不用开刀,就能看到内部每一处细节。
GDB能做什么?
我列几个最常用的场景,都是我在项目中实际用过的:
- 设置断点:让程序在指定行停下来,看看当前状态
- 单步执行:一行一行地走,观察每一步的变化
- 查看变量:随时检查变量的值,包括指针指向的内容
- 调用栈分析:程序崩溃时,看看是谁调了谁,一路追到根因
- 条件断点:只在特定条件满足时才停下来,比如循环到第100次
- 内存检查:直接查看某块内存的内容,对嵌入式开发特别有用
- 修改变量:调试过程中临时改个值,看看效果
核心价值:GDB让你从「猜bug」变成「看bug」。效率提升不是一点半点。
GDB的安装
安装GDB其实很简单。不同平台略有差异,我分别说一下:
| 平台 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu/Debian | sudo apt install gdb |
最常用,直接装 |
| CentOS/RHEL | sudo yum install gdb |
老版本用yum |
| macOS | brew install gdb |
需要Homebrew |
| Windows | MinGW或Cygwin | 建议用WSL更方便 |
装完之后,在终端输入 gdb --version,能看到版本号就说明装好了。
小提示:我建议装最新稳定版。曾经有个项目,我用旧版GDB调试多线程程序,死活看不到某些线程的状态,升级后就好了。嗯,版本问题有时候很坑。
基本启动
启动GDB的方式有两种,我分别说一下:
方式一:直接启动
gdb ./my_program
这样会直接进入GDB界面,等待你输入调试命令。
方式二:先启动再加载
gdb
(gdb) file ./my_program
这种方式适合你还没想好要调试哪个程序的时候。
启动之后,你会看到类似这样的提示符:
(gdb) _
看到这个,就说明GDB已经准备好了,等着你发号施令。
注意:编译程序时一定要加 -g 选项,否则GDB看不到源码和变量名。我曾经帮一个同事看bug,折腾了半天才发现他编译时没加 -g,白费功夫。
举个例子,编译时这样写:
gcc -g -o my_program main.c utils.c
这样生成的 my_program 就包含了调试信息,GDB才能正常工作。
知识体系一览
下面这张图,是我自己总结的GDB入门知识结构,你看一眼就能明白整体脉络:
这张图把GDB入门的三个核心问题串起来了。你顺着看下来,心里就有个框架了。
好了,GDB是什么、能做什么、怎么装、怎么启动,这些基础内容就讲完了。下一节我们开始真正上手操作,我会带你写个简单的多文件项目,然后用GDB一步步调试。到时候你会发现,原来调试可以这么爽。
一句话总结:GDB不是万能的,但没有GDB是万万不能的。尤其是做嵌入式开发,printf调试的效率跟GDB比,差了一个数量级。