1、GDB入门:GDB是什么、GDB与Qt的关系、GDB的安装与版本确认
1.1 GDB到底是什么?
GDB,全称GNU Debugger。说白了,就是一个命令行下的调试器。
你可能会问:现在IDE不都有图形化调试吗?为什么还要学这个?
嗯,我刚开始做Qt开发时也这么想。直到有一次,程序在客户现场崩溃,远程连不上IDE,只能靠一个终端窗口和日志文件。那时候我才意识到——GDB是最后一道防线。
GDB能做什么?
- 让程序在指定行停下来(断点)
- 一步步执行代码,看变量怎么变
- 程序崩溃时,告诉你死在哪个函数、哪一行
- 查看内存、寄存器、调用栈
- 甚至能修改运行中的变量值
我个人习惯把GDB比作「程序的CT机」。IDE调试像普通X光片,能看到大概;GDB则是断层扫描,每一层都给你看透。
核心观点:GDB不是IDE的替代品,而是IDE调试功能失效时的保底手段。尤其在嵌入式、服务器端、无图形界面的场景下,GDB几乎是唯一选择。
1.2 GDB与Qt的关系
Qt Creator自带的调试器,底层就是GDB。你点那个绿色小三角旁边的「调试」按钮,Qt Creator其实在背后帮你调用了GDB。
但有个问题:Qt Creator把GDB包装得太好了。你点一下「下一步」,它帮你执行了next命令;你悬停看变量,它帮你执行了print命令。方便是方便,可一旦包装层出问题,你就抓瞎了。
我记得有一次,Qt Creator突然无法显示QString的内容,显示一堆乱码。重启IDE、重装插件都没用。最后我直接在终端里用GDB调试,发现是Qt的pretty-printer脚本版本不匹配。手动加载正确的脚本后,一切正常。
所以,GDB与Qt的关系可以总结为三点:
| 层面 | 说明 |
|---|---|
| 调试后端 | Qt Creator的调试功能底层依赖GDB |
| 符号支持 | GDB能识别Qt的元对象系统、信号槽等特性 |
| 扩展能力 | 通过Python脚本,GDB可以定制Qt类型的显示方式 |
小技巧:在Qt Creator中按F10单步调试时,其实就是在用GDB的next命令。如果你在「应用程序输出」面板看到(gdb)提示符,说明你已经进入了GDB的交互模式。
1.3 GDB的安装
安装GDB其实很简单。不同平台略有差异,我分别说一下。
Linux(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install gdb
一行命令搞定。我个人推荐用这种方式,因为Linux下的GDB最稳定。
macOS
brew install gdb
注意:macOS上安装GDB后,还需要对GDB进行代码签名,否则无法调试。这个坑我踩过——装完GDB后一运行就报Unable to find Mach task port。解决方案是创建一个代码签名证书,然后签名。具体步骤有点繁琐,我们后面章节会细讲。
Windows
Windows下有两种方式:
- MinGW版:如果你用Qt的MinGW套件,GDB已经随Qt一起安装了。路径一般在
C:\Qt\Tools\mingw730_64\bin\gdb.exe - MSYS2版:通过MSYS2的pacman安装
pacman -S mingw-w64-x86_64-gdb
注意:Windows下不要用Visual Studio的调试器替代GDB。虽然VS的调试器也很强大,但它的命令和GDB完全不同。我们这门课所有内容都基于GDB,请确保你安装的是GNU GDB。
1.4 版本确认
安装完成后,第一件事就是确认版本。
gdb --version
你会看到类似这样的输出:
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
版本号至少要在7.0以上。为什么?因为7.0版本开始,GDB引入了Python脚本支持,这对调试Qt程序至关重要。Qt的pretty-printer就是基于Python的。
我曾经在项目里用过GDB 6.8,那叫一个痛苦——不能自定义类型显示,看QString就是一堆内存地址。后来升级到7.2,世界瞬间清净了。
建议:使用GDB 10.0以上版本。新版本对C++17/20的支持更好,而且修复了很多Qt调试相关的bug。
1.5 知识体系总览
下面这张图,是我自己总结的GDB入门知识结构。你可以把它当作一张地图,后续学习时随时回来对照。
1.6 快速验证:你的GDB能用吗?
装完GDB后,我建议你立刻做一个快速验证。写一个最简单的C++程序:
// test.cpp
#include <iostream>
int main() {
int a = 42;
std::cout << "Hello GDB" << std::endl;
return 0;
}
编译时记得加-g选项:
g++ -g -o test test.cpp
然后启动GDB:
gdb ./test
你会看到GDB的提示符(gdb)。输入run运行程序,输入quit退出。如果能正常跑起来,恭喜你,GDB安装成功。
一个小建议:第一次用GDB时,可以试试help命令。GDB的帮助系统写得相当详细,而且支持模糊搜索。比如输入help break,它会列出所有和断点相关的命令。
好了,GDB的安装和基本概念就讲到这里。记住一句话:GDB不是洪水猛兽,它只是你工具箱里的一把瑞士军刀。用熟了,你会爱上它的。
本章要点回顾:
- GDB是GNU调试器,是IDE调试的底层引擎
- Qt Creator的调试功能基于GDB
- 安装GDB后务必确认版本号 ≥ 7.0
- 编译时加
-g选项才能生成调试信息
可可精品资料库