GDB(GNU Debugger)是 Linux 环境下最强大的调试工具,被誉为程序员的"瑞士军刀"。它能帮你深入程序内部,查看变量、分析崩溃原因、甚至进行多线程调试。
全流程概述
为了让你少走弯路,我为你整理了一份**"保姆级"的 GDB 安装与配置教程**,涵盖了从安装、基础配置到核心工作流的全过程。
本文着重讲在Linux和windows系统中怎么安装配置GDB,
(要是想直接开始安装的话可以直接目录跳转到后面)
文章后面有详细安装步骤和**"从写代码到开始调试"** 的完整流程。
🛠️ 第一步:安装 GDB
GDB 的安装非常简单,取决于你使用的操作系统。
1. Linux 系统(最常用环境)(操作也简单)
大多数 Linux 发行版都可以通过包管理器直接安装。
| 发行版 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu / Debian | sudo apt update sudo apt install gdb |
推荐同时安装 build-essential 以获取 GCC 编译器 |
| CentOS / RHEL | sudo yum install gdb 或 sudo dnf install gdb |
建议安装 glibc-debuginfo 以便调试系统库 |
| Fedora | sudo dnf install gdb |
💡 提示 :如果你需要调试 C++ 标准库(如 STL 容器),建议安装
libstdc++6-xx-dbg或gdb-doc包,这样在调试时能看到更详细的内部结构。
2. macOS 系统
macOS 用户通常使用 Homebrew 进行安装。
-
安装 Homebrew (如果尚未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
安装 GDB :
brew install gdb注意:在 macOS 上运行 GDB 需要对其进行代码签名(Code Signing)以赋予调试权限,否则会报错。初次运行请参考 Homebrew 的提示信息或搜索"GDB macOS codesign"进行配置。
3. Windows 系统
Windows 原生不支持 GDB,通常通过以下两种方式:
- WSL (Windows Subsystem for Linux):推荐安装 Ubuntu 子系统,然后按照上述 Linux 步骤安装,体验最接近原生开发。
- MinGW / TDM-GCC :下载并安装 MinGW,安装时勾选 GDB 组件,并将
bin目录(如C:\MinGW\bin)添加到系统的PATH环境变量中。
⚙️ 第二步:基础配置(让 GDB 更好用)
默认的 GDB 界面比较简陋(无语法高亮、显示行数少)。我们可以通过配置 ~/.gdbinit 文件来优化体验。
请在终端执行以下命令,创建或编辑配置文件:
vim ~/.gdbinit
如果没有vim

- 打开 MSYS2 终端 :从开始菜单打开
MSYS2 UCRT64(或你安装的那个版本)。 - 安装 vim:在 MSYS2 终端里输入以下命令安装 vim,再输入上面的代码

输入代码后:

现在的界面就是 vim 编辑器,但它目前处于只读模式(只能看,不能改),所以你需要先做一个简单的操作才能开始输入。
-
进入编辑模式
请按下键盘上的
i键(代表 insert 插入)。- 你会看到屏幕左下角的状态栏(或者底部提示)发生变化,可能出现
-- INSERT --字样,或者光标变样,这就代表可以输入了。 
- 你会看到屏幕左下角的状态栏(或者底部提示)发生变化,可能出现
将以下内容粘贴进去,这将极大提升你的调试体验:
请尝试使用键盘快捷键 Shift + Insert。
这是终端里一个非常通用的粘贴快捷键,通常比 Ctrl+V 更有效。
# ~/.gdbinit 配置文件内容
# 1. 界面美化
set listsize 20 # 显示代码时默认显示 20 行(默认是 10 行)
set syntax on # 开启语法高亮(代码会有颜色)
set prompt "(gdb) " # 设置提示符,简洁明了
set pagination off # 关闭分页(防止输出长内容时需要按回车)
# 2. 调试信息增强
set print pretty on # 美化结构体输出(缩进显示)
set print array on # 美化数组输出
set print object on # 显示 C++ 对象的实际类型
set print demangle on # 还原 C++ 被编译混淆的函数名
set print frame-arguments all # 显示函数调用时的参数值
# 3. 历史记录
set history save on # 保存命令历史,下次启动还能用上下键翻阅
set history filename ~/.gdb_history
set history size 10000 # 历史记录保存 10000 条
# 4. 常用别名(偷懒神器)
alias br = break # br 代替 break
alias c = continue # c 代替 continue
alias bt = backtrace # bt 代替 backtrace
alias ls = list # ls 代替 list

-
粘贴完代码后,请按以下顺序操作:
- 按一下键盘左上角的
Esc键(退出编辑模式)。 - 输入
:wq(注意是英文冒号,然后输入 wq)。 - 按
Enter回车键。
- 按一下键盘左上角的
这样配置就保存成功了,下次你启动 GDB 时,这些优化就会自动生效。
🚀 第三步:调试前的准备(关键!)
很多新手安装好 GDB 后,发现调试时看不到变量名,也定位不到代码行号,原因只有一个:编译时没有加 -g 参数。
错误的编译方式:
gcc main.c -o main # 这样生成的程序没有调试信息,GDB 无法深入内部
正确的编译方式:
gcc -g main.c -o main
-g:告诉编译器在可执行文件中加入调试信息(Debug Symbols)。- 如果是 C++ 程序,请使用
g++ -g ...。
📖 第四步:核心工作流(5分钟上手)
假设你已经用 gcc -g main.c -o main 编译好了程序,下面是最常用的调试流程:
1. 启动 GDB
gdb ./main
2. 常用命令速查表
| 功能 | 完整命令 | 简写 | 说明 |
|---|---|---|---|
| 设置断点 | break main |
b main |
在 main 函数打断点,也可以用行号 b 10 |
| 运行程序 | run |
r |
开始运行,如果有参数可写 r arg1 arg2 |
| 单步跳过 | next |
n |
执行下一行代码,不进入函数内部 |
| 单步进入 | step |
s |
执行下一行代码,进入函数内部 |
| 继续执行 | continue |
c |
直接跳到下一个断点 |
| 打印变量 | print var |
p var |
查看变量当前值 |
| 查看堆栈 | backtrace |
bt |
程序崩溃或暂停时,查看函数调用链 |
| 查看源码 | list |
l |
显示当前代码 |
| 退出 | quit |
q |
退出 GDB |
3. 实战演示
(gdb) b main # 在 main 函数处停下
(gdb) r # 运行程序
(gdb) n # 一行行执行
(gdb) p my_variable # 看看变量值对不对
(gdb) c # 没问题了,继续跑
🛡️ 第五步:进阶技巧(解决崩溃问题)
当程序发生段错误(Segmentation Fault)崩溃时,如果开启了 Core Dump,GDB 可以帮你"起死回生"分析现场。
-
开启 Core Dump 生成(Linux)
ulimit -c unlimited这样程序崩溃后会在当前目录生成一个
core文件。 -
分析崩溃现场
gdb ./main core进入 GDB 后,直接输入
bt(backtrace),你就能清晰地看到程序是在哪一行代码、哪个函数调用中崩溃的。
Linux系统中详细安装步骤
我是用的ubuntu虚拟机,如果没装的具体安装配置可看:Ubuntu 24.04 虚拟机完整安装 + PWN / 渗透环境配置 全流程总结_ubuntu24.04安装教程-CSDN博客
安装好虚拟机后打开,在桌面上,有点,在终端打开
安装步骤
输入两行命令
sudo apt update
sudo apt install gdb

直接输入密码(不会显示,直接输入了之后回车就行)等待安装结束

安装好了之后
编写代码
在 Ubuntu 的终端里,输入以下命令来创建一个文件夹并进入
mkdir mytest
cd mytest
然后用 nano 编辑器创建一个代码文件:
nano test.c
输入这段简单的代码(故意留个逻辑方便调试):
#include <stdio.h>
int main() {
int i;
for(i = 0; i < 5; i++) {
printf("Current number is: %d\n", i);
}
return 0;
}
保存退出 :按 Ctrl+O 回车保存,再按 Ctrl+X 退出。
编译(关键步骤)
在 Linux 下编译,一定要加上 -g 参数,这样 GDB 才能读取到调试信息
gcc test.c -o test -g
如果不加 -g,你进去调试时会发现看不到源代码,只能看到汇编代码,那就麻烦了。
启动 GDB
输入以下命令启动调试:
gdb test
你会看到 (gdb) 提示符,说明进去了。
我测试时遇到的问题,(一开始没仔细看还以为红色是报错)

但是其实是加载了一个叫 pwngdb 的插件。这个插件通常用于二进制安全或 CTF 竞赛的调试辅助。
关键变化
提示符变成了 pwngdb>,而不是标准的 (gdb)。
这意味着什么
你依然在使用 GDB,所有的标准命令(如 l, b, r, n)依然有效。只不过多了一些高级功能,比如查看堆栈、寄存器等。
现在该做什么
你可以直接开始调试了。假设你已经编译好了一个叫 test 的程序(如果没有,请先用 gcc test.c -o test -g 编译)。
在 pwngdb> 后面输入:
file test

或者如果你已经在启动时加载了文件,直接输入:
(这是 list 的简写,用来查看代码)
总结
一切正常,你可以继续按之前的步骤操作了。
开始调试(实战演练)
现在你已经在 (gdb) 里面了,试着输入以下命令(注意:GDB 支持简写,我会在括号里标出来):
查看代码输入:
list
或者简写:
l

你会看到刚才写的 C 代码出现在屏幕上。
设置断点
我们想在 for 循环那一行(通常是第 6 行)停下来看看。输入:
break 6
或者简写:
b 6

它会提示 Breakpoint 1 at ...
运行程序输入:
run
或者简写:
r

程序会跑起来,然后停在第 6 行。你会看到提示 Breakpoint 1, main () at test.c:6。
查看变量
现在程序停在第 6 行,i 的值是多少呢?输入:
print i
或者简写:
p i

它会告诉你 i 现在是 0。
单步执行
让程序往下走一步。输入:
next
或者简写:
n

程序会执行完这一行,再次打印 Current number is: 0,然后停在下一轮循环。
再输入一次 n,再输入 p i,你会发现 i 变成了 1。


继续运行
如果你想让程序直接跑完剩下的循环,不再一步步停了。输入:
continue
或者简写:
c

退出 GDB
调试完了,想退出来回到终端。输入:
quit
或者简写:
q

🎉 恭喜
你刚才完成了一次标准的 Linux 程序调试!
如果你也做了windows系统的,你会发现,在 Ubuntu 里用 GDB,和在 Windows 的 MSYS2 里用 GDB,命令几乎是一模一样的。
windows系统中详细安装步骤
在 Windows 上安装 GDB 其实就是在安装一个包含 GDB 的 C/C++ 编译器套件。为了让你能最快上手,我为你准备了两种最主流、最稳妥的方案。
请根据你的需求选择其中一种(强烈建议选择方案一,更现代、更稳定):
🚀 方案一:使用 MSYS2 安装(推荐,现代化且包管理方便)
这是目前 Windows 上最推荐的开源工具链安装方式,类似于 Linux 的包管理器,安装和更新都非常方便。
1. 下载并安装 MSYS2
(1)访问 MSYS2 官网 下载安装包。一般选左边的

- 左边 (
x86_64) :这是给主流的 Intel 或 AMD 处理器的电脑准备的。99% 的 Windows 电脑都属于这一类,所以如果你不确定,选这个就对了。- 右边 (
arm64):这是给 ARM 架构处理器的电脑准备的,比如微软的 Surface Pro X 或者一些高通骁龙处理器的笔记本电脑。
(2)双击运行,按照提示安装(建议安装在默认路径 C:\msys64)。要换安装路径可以换


2. 安装 GCC 和 GDB
安装完成后,MSYS2 会自动打开一个终端窗口。你需要依次执行以下步骤(请严格按照顺序):
-
更新核心包 :
在终端输入以下命令并回车(如果提示确认,输入
y并回车):pacman -Syu这个终端窗口不能ctrl+v粘贴,要右键点粘贴,和kali一样(没截到图,运行完自动关了)
-
如果更新完成后提示你关闭所有 MSYS2 窗口,请务必关闭当前窗口,然后重新从开始菜单打开"MSYS2 MinGW 64-bit"。
-
安装编译器与调试器 :
重新打开 "MSYS2 MinGW 64-bit" 终端(图标通常是绿色的,第一个MSYS2 UCRT64),输入以下命令安装 64 位的 GCC 和 GDB

pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb

输入 y 确认安装,等待进度条跑完。

3. 配置环境变量(关键步骤!)
为了让 GDB 能在任意命令行窗口中使用,你需要把它的路径加入系统变量:
- 按
Win键,搜索"编辑系统环境变量"并打开。 - 点击右下角的"环境变量"按钮。
- 在"系统变量 "(下方的框)中找到
Path,选中后点击"编辑"。 - 点击"新建 ",添加 MSYS2 的 bin 目录路径(假设安装在默认位置):
C:\msys64\mingw64\bin
- 一路点击"确定"保存。
📦 方案二:使用 MinGW-w64 压缩包(免安装,解压即用)
如果你不想安装软件,或者只需要一个独立的工具包,可以使用这种"绿色版"方式。
1. 下载工具包
- 访问 MinGW-w64 的 SourceForge 页面。
- 下载最新的压缩包(文件名通常类似
x86_64-13.2.0-release-posix-seh...7z)。
2. 解压文件
- 解压下载的文件到一个简单的路径,例如
C:\mingw64。 - 确保解压后的
bin文件夹里能看到gdb.exe和gcc.exe。
3. 配置环境变量
- 按
Win键,搜索"编辑系统环境变量"。 - 点击"环境变量 " -> 在"系统变量 "中找到
Path-> 点击"编辑"。 - 点击"新建 ",添加你刚才解压的路径下的 bin 目录:
C:\mingw64\bin - 一路点击"确定"保存。
✅ 验证安装是否成功
无论你选择了哪种方案,都需要验证一下:
-
打开一个新的 命令提示符(CMD)或 PowerShell 窗口(注意:必须新开窗口,旧窗口无法识别新环境变量)。
-
输入以下命令:
gdb -v -
如果看到类似
GNU gdb (GDB) 13.x ...的输出信息,恭喜你,GDB 安装成功了!

💡 避坑指南
- 不要混用:如果你之前安装过旧版的 MinGW (mingw.org),建议卸载或确保环境变量指向正确的版本,否则可能会出现兼容性问题。
- 必须加 -g :在 Windows 上使用 GDB 调试时,编译代码一定要加上
-g参数(例如gcc -g main.c -o main.exe),否则 GDB 只能看到汇编代码,看不到源码。
问题1:能不能修改安装路径
可以的,都支持自定义安装路径。
不过,为了避免以后出现各种奇怪的路径报错,我有几个重要的建议给到你。
1. 如果你选择方案一(MSYS2 安装版)
在安装 MSYS2 的初始向导界面中:
- 可以修改 :安装程序会询问安装目录,默认是
C:\msys64。你可以点击"浏览"修改到任意盘符,例如D:\msys64。- ⚠️ 强烈建议 :
- 路径越短越好 :尽量保持在根目录下,如
D:\msys64。- 严禁包含中文或空格 :千万不要安装在
D:\我的软件\MSYS2或者Program Files这种带空格的目录下。因为 GCC/GDB 等编译工具对中文和空格路径的支持非常差,极易导致编译失败或找不到文件。2. 如果你选择方案二(MinGW-w64 压缩包)
这种方式本质上就是解压文件,路径完全由你决定:
- 操作方法 :下载
.7z或.zip压缩包后,直接解压到你想要的位置,例如E:\Tools\mingw64。- ⚠️ 注意事项 :
- 解压后,请务必记住你存放的路径。
- 在配置环境变量(Path)时,要准确填入你解压后的
bin目录路径(例如E:\Tools\mingw64\bin)。3. 修改路径后的关键步骤:环境变量
无论你修改到哪里,最关键的一步 是必须把新路径下的
bin目录加入到系统的Path环境变量中,否则你在命令行输入gdb时,系统会提示"找不到命令"。检查方法:
- 打开新的 CMD 窗口。
- 输入
gdb -v。- 如果显示版本信息,说明路径配置成功;如果提示"不是内部或外部命令",说明环境变量没配好,请重新检查路径是否包含
bin文件夹。
确定安装好了之后,怎么使用
既然环境已经配置好了,接下来就是实际的调试环节。虽然 MSYS2 提供了类似 Linux 的终端,但为了让你在任何地方都能顺手使用,我建议你直接在 Windows 自带的 CMD 或 VS Code 里操作。
后面有完整演示过程,可跟练强化记忆
下面我为你整理了三种最常用的使用方式,按推荐程度排序:
🚀 方法一:在 VS Code 中使用(最推荐,有图形界面)
如果你平时用 VS Code 写代码,这是最舒服的方式,可以直接点按钮打断点,不用背命令。
- 安装插件 :在 VS Code 扩展商店搜索并安装
C/C++ Extension Pack。 
- 准备代码 :新建一个文件夹,在里面创建一个
main.c文件,写几行简单的代码。 - 配置调试 :
- 点击左侧菜单栏的"运行和调试"图标(像个播放键带个虫子)。
- 点击 "创建 launch.json 文件"。
- 选择环境:
C++ (GDB/LLDB)。 - 选择配置:选择
gcc.exe - 生成和调试活动文件。
- 修改配置(关键一步) :
VS Code 自动生成的配置通常能自动找到 GDB,但如果报错,你需要手动检查launch.json里的miDebuggerPath。- 如果你装的是 UCRT64 ,确保路径是:
"C:\\msys64\\ucrt64\\bin\\gdb.exe" - 如果你装的是 MINGW64 ,确保路径是:
"C:\\msys64\\mingw64\\bin\\gdb.exe"
- 如果你装的是 UCRT64 ,确保路径是:
- 开始调试 :
- 在代码行号左边点击,出现红点(打断点)。
- 按
F5,程序就会运行并在红点处停下来,你可以查看变量的值。
💻 方法二:在 Windows CMD 中使用(纯命令行)
如果你想像黑客一样在黑窗口里调试,或者不想装编辑器,可以直接用命令行。
前提 :你的 C 代码文件(比如 test.c)必须先编译,并加上 -g 参数(这是加入调试信息的关键)。
-
编译代码:打开 CMD,进入代码所在目录,输入
gcc test.c -g -o test.exe(注意:
-g不能少,否则 GDB 没法调试) -
启动 GDB:输入
gdb test.exe你会看到
(gdb)的提示符,说明进入调试器了。 -
常用调试命令(背下来这几个就够用了):
list(或l):显示源代码。break main(或b main):在 main 函数处打个断点。run(或r):开始运行程序(遇到断点会停下)。next(或n):单步执行(不进入函数内部)。step(或s):单步执行(会进入函数内部)。print 变量名(或p 变量名):查看某个变量的当前值。continue(或c):继续运行直到下一个断点。quit(或q):退出 GDB。
🐚 方法三:在 MSYS2 终端中使用
这是最"原生"的方式,适合习惯 Linux 操作风格的用户。
- 打开开始菜单,运行
MSYS2 UCRT64(或你安装的那个版本)。 - 使用
cd命令进入你的代码目录。 - 编译:
gcc test.c -g -o test.exe - 调试:
gdb test.exe
(操作命令和方法二完全一样)
💡 总结建议
- 新手/写作业/项目开发 :请务必使用 VS Code。图形化界面能让你更专注于逻辑,而不是命令。
- 考试/面试/装酷 :练习使用 CMD 命令行 ,掌握
break,run,next,print这几个核心命令。
**"从写代码到开始调试"**的完整流程
🛠️ 核心流程:三步走
GDB 不能直接调试源代码(.c 文件),它只能调试编译好的可执行文件。所以,核心流程是:写代码 -> 加参数编译 -> 启动调试。
🎮 实战演示
假设你的 test.c 内容如下:
#include <stdio.h>
int main() {
int i = 0;
for(i = 0; i < 5; i++) {
printf("Hello %d\n", i);
}
return 0;
}

1. 编译代码(关键一步)
在终端中输入以下命令:(需要在这个代码文件存放的文件夹里打开终端)
gcc test.c -o test -g
gcc test.c:调用编译器。-o test:生成名为test.exe的可执行文件。-g:这是最重要的参数! 它告诉编译器在程序里加入调试信息(比如行号、变量名)。如果没有这个参数,GDB 里看不到源代码,只能看到汇编。

2. 启动 GDB
编译成功后,输入以下命令启动调试器:
gdb test
(注意:这里填的是生成的可执行文件名 test,不是 test.c)
此时,你会看到 (gdb) 的提示符,说明你已经进入调试器内部了。

3. 开始调试(常用命令)
进入 (gdb) 提示符后,你就可以输入指令了。默认情况下,GDB 其实已经内置了很多简写(比如 r 代表 run,l 代表 list,c 代表 continue)多多尝试熟悉一下:
| 功能 | 完整命令 | 简写命令 (你的配置) | 说明 |
|---|---|---|---|
| 查看代码 | list |
l |
显示源代码,按回车可继续显示下一段 |
| 设置断点 | break 行号 |
br 行号 |
例如 br 10,在第10行停下 |
| 运行程序 | run |
r |
开始运行,直到遇到断点 |
| 单步执行 | next |
n |
执行下一行(不进入函数内部) |
| 进入函数 | step |
s |
执行下一行(如果有函数,会进去) |
| 查看变量 | print 变量名 |
p 变量名 |
打印变量的当前值 |
| 继续运行 | continue |
c |
从当前断点跑到下一个断点 |
| 退出 | quit |
q |
退出 GDB |




我在测试的时候出现了个小问题,(倒数第二第三行显示error)

这说明文件第 4 行写错了。
- 原因 :在
.gdbinit里写了类似 Linux Shell 的注释(用#开头),但 GDB 的配置文件不支持用#做注释(或者写法位置不对)。 - 解决 :打开这个文件,把第 4 行的
#删掉,或者改成 GDB 支持的注释方式(通常是用#但在某些旧版本或特定上下文可能不支持,建议直接删除注释行测试)。
操作流程总结:
- 编译 :
gcc test.c -o test -g - 启动 :
gdb test - 在 GDB 里操作 :
- 输入
l:查看代码。 - 输入
br 5:在第 5 行(printf 那一行)打个断点。 - 输入
r:程序启动,会停在第 5 行。 - 输入
p i:查看变量i的值(此时应该是 0)。 - 输入
n:执行这一行,屏幕打印 "Hello 0",光标移到下一行。 - 输入
c:程序继续跑,打印剩下的内容直到结束。 - 输入
q:退出。
- 输入
💡 小贴士
如果你觉得命令行太麻烦,其实 VS Code 就是把这些命令图形化了。你在 VS Code 里点"运行"按钮,它底层其实就是帮你执行了上面这些步骤。
现在,你可以试着编译一个小程序,用 gdb 跑一下,体验一下刚才配置的 ls、br 等快捷命令!
📌 总结
- 安装 :
sudo apt install gdb - 配置 :编辑
~/.gdbinit开启高亮和历史记录。 - 编译 :一定要加
-g参数! - 调试 :记住
b(断点),r(运行),n(单步),p(打印),bt(堆栈) 这五个核心命令。
掌握这些,你就已经跨过了 GDB 的门槛,能够应对绝大多数的调试需求了!