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交互界面后,我们来走一遍基本流程:

  1. 设置断点:break main —— 在main函数入口停下。
  2. 运行程序:run —— 程序会在main处暂停。
  3. 单步执行:next —— 执行下一行代码。
  4. 打印变量:print x —— 看看x的值是多少。
  5. 进入函数:step —— 进入add函数内部。
  6. 查看堆栈:backtrace —— 看看当前在哪个函数里。
  7. 继续运行:continue —— 让程序跑完。

实际操作一下,你会发现:

  • 执行 print x 时,GDB会告诉你 $1 = 10。
  • 执行 step 进入add后,print result 能看到 $2 = 30。
  • 执行 backtrace 会显示 #0 add ... #1 main ...,调用关系一目了然。

注意:我曾经犯过一个低级错误——编译时忘了加 -g。结果GDB启动后,断点打不上,变量也看不了。折腾了半天才发现问题。所以,编译时务必加 -g,这是GDB能工作的前提。

1.5 本章知识体系

为了让你更直观地理解本章内容,我画了一张图:

GDB入门 GDB是什么 GDB能做什么 安装与启动 第一个调试案例 GNU调试器,程序显微镜 断点、单步、变量、堆栈 内存、多线程/进程 apt-get / yum / brew gdb --version 验证 编译加 -g 选项 break / run / next print / step / backtrace

这张图把本章的核心知识点串起来了。你顺着看一遍,心里就有谱了。

1.6 写在最后

GDB入门其实不难。你只要记住三件事:

  • 编译加 -g
  • 会用 break、run、next、print 这四个命令
  • 遇到问题别慌,backtrace 能帮你找到回家的路

剩下的,就是在实战中慢慢积累了。我当年也是从这几个命令开始,一步步走到今天的。你也能行。

可可精品资料库