1、GDB简介:GDB是什么、GDB能做什么、GDB与其它调试器的对比、GDB的安装与启动

大家好,我是你们的老朋友。今天咱们正式开始聊GDB调试。说实话,我入行头两年,调试全靠printf大法,代码里到处是打印语句。直到有一次,一个同事看我满头大汗地加打印、编译、运行、再改代码,他丢过来一句:「你试试GDB吧。」

嗯,这一试,就回不去了。

GDB是什么?

GDB的全称是GNU Project Debugger。说白了,就是一个让你能「钻进程序内部」看个究竟的工具。它不是IDE里那种点一下就能跑的调试器,而是跑在命令行里的。你可能会问:「都什么年代了,还用命令行?」

我个人的看法是:命令行调试器,恰恰是嵌入式开发和C/C++调试中最可靠、最灵活的选择。没有图形界面的依赖,没有IDE版本兼容的烦恼,一个终端、一个GDB,哪里都能调。

GDB能调试的语言包括C、C++、Go、Rust、Fortran等。但咱们这个课程,主要聚焦在C/C++和嵌入式场景。

核心一句话:GDB是GNU生态下的标准调试器,是Linux/Unix平台上调试C/C++程序的首选工具。

GDB能做什么?

我简单列一下GDB的核心能力,你感受一下:

  • 设置断点:在代码的某一行、某个函数、甚至某个条件满足时停下来
  • 单步执行:一行一行地走,看程序到底是怎么跑的
  • 查看变量:随时查看变量的值,甚至修改它
  • 查看堆栈:程序崩溃了?看看调用链,找到是谁调了谁
  • 反汇编:想看汇编代码?没问题,GDB直接给你展示
  • 远程调试:这是嵌入式开发的核心功能——在PC上调试开发板上的程序
  • 多线程/多进程调试:切换线程、查看锁状态,都能做

我记得有一次,一个同事调了三天的一个死锁问题,我过去用GDB的thread apply all bt命令,两分钟就定位到了问题。嗯,那之后他再也不用printf了。

GDB与其它调试器的对比

咱们来做个对比,这样你心里更有数。

特性 GDB LLDB Visual Studio调试器 IDE内置调试器(如Eclipse CDT)
平台 Linux/Unix为主,也支持Windows macOS/Linux Windows 跨平台
界面 命令行 命令行 图形化 图形化
嵌入式支持 极强(通过GDB Server) 一般 弱 中等
脚本扩展 Python脚本,非常灵活 Python脚本 有限 有限
学习曲线 较陡 中等 平缓 平缓
远程调试 原生支持 支持 需插件 需配置

你想想看,如果你做的是嵌入式开发,或者需要在服务器上调试没有图形界面的程序,GDB几乎是唯一的选择。LLDB虽然也不错,但在嵌入式领域,GDB的生态更成熟。

我的建议:如果你刚开始学调试,别急着上图形化工具。先在命令行里把GDB的基本命令练熟,你会发现,图形化工具只是GDB的「皮肤」而已。

GDB的安装与启动

安装GDB其实很简单。不同的系统,命令略有不同。

Linux系统

# Ubuntu/Debian
sudo apt-get install gdb

# CentOS/RHEL/Fedora
sudo yum install gdb
# 或者
sudo dnf install gdb

# Arch Linux
sudo pacman -S gdb

macOS系统

# 使用Homebrew
brew install gdb

注意:macOS上安装GDB后,还需要进行代码签名,否则无法调试。这个坑我踩过,折腾了整整一个下午。具体做法是创建一个自签名证书,然后授权给GDB。网上有详细教程,我这里就不展开了。

Windows系统

Windows上推荐使用MinGW或Cygwin来安装GDB。我个人习惯用MinGW:

# 下载MinGW安装器,选择gdb包安装
# 或者直接使用MSYS2
pacman -S mingw-w64-x86_64-gdb

验证安装

安装完成后,打开终端,输入:

gdb --version

如果看到类似下面的输出,就说明安装成功了:

GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
...

启动GDB

启动GDB有两种常见方式:

  1. 直接启动,再加载程序
gdb
(gdb) file ./my_program
  1. 启动时直接加载程序
gdb ./my_program

我个人更推荐第二种方式,一步到位,省事。

注意:想要用GDB调试,编译时必须加上-g选项。否则,你看到的只有汇编代码,没有源码信息。

gcc -g -o my_program my_program.c

我曾经有一次忘了加-g,调试了半天,发现变量名全是乱码。嗯,从那以后,我写Makefile时第一件事就是把-g加上。

本章知识体系

下面这张图,帮你快速理清本章的核心内容:

GDB调试器 GDB是什么 GNU Project Debugger 命令行调试器 支持C/C++/Go/Rust等 GDB能做什么 设置断点 单步执行 查看/修改变量 查看堆栈 远程调试 与其它调试器对比 LLDB:macOS常用 VS调试器:Windows图形化 IDE内置:Eclipse等 安装与启动 Linux: apt/yum/pacman macOS: brew install Windows: MinGW/MSYS2 编译加 -g 选项

好了,第一章的内容就到这里。GDB的安装其实不难,难的是后面怎么用好它。下一章咱们就开始真正上手,写一个简单的程序,然后用GDB把它「解剖」开来看。

可可精品资料库