一、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能做什么 安装与启动 GNU调试器 程序CT机 设置断点 单步执行 查看变量 调用栈分析 条件断点 内存检查 apt/yum/brew安装 gdb --version验证 编译加 -g 选项 核心:从「猜bug」到「看bug」

这张图把GDB入门的三个核心问题串起来了。你顺着看下来,心里就有个框架了。

好了,GDB是什么、能做什么、怎么装、怎么启动,这些基础内容就讲完了。下一节我们开始真正上手操作,我会带你写个简单的多文件项目,然后用GDB一步步调试。到时候你会发现,原来调试可以这么爽。

一句话总结:GDB不是万能的,但没有GDB是万万不能的。尤其是做嵌入式开发,printf调试的效率跟GDB比,差了一个数量级。

可可精品资料库