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有两种常见方式:
- 直接启动,再加载程序
gdb
(gdb) file ./my_program
- 启动时直接加载程序
gdb ./my_program
我个人更推荐第二种方式,一步到位,省事。
注意:想要用GDB调试,编译时必须加上-g选项。否则,你看到的只有汇编代码,没有源码信息。
gcc -g -o my_program my_program.c
我曾经有一次忘了加-g,调试了半天,发现变量名全是乱码。嗯,从那以后,我写Makefile时第一件事就是把-g加上。
本章知识体系
下面这张图,帮你快速理清本章的核心内容:
好了,第一章的内容就到这里。GDB的安装其实不难,难的是后面怎么用好它。下一章咱们就开始真正上手,写一个简单的程序,然后用GDB把它「解剖」开来看。
可可精品资料库