GDB 调试器使用指南
- 嵌入式开发
- 14小时前
- 17热度
- 0评论
GDB 调试器使用指南
GDB(GNU Debugger)是 Linux 下最常用的 C/C++ 程序调试工具。GDB 主要能做以下四件事来帮助你定位 Bug:
- 启动程序 —— 可以指定任何可能影响程序行为的参数与环境。
- 条件中断 —— 让程序在满足指定条件时停下来。
- 检查现场 —— 程序停下后,检查当时究竟发生了什么。
- 动态修改 —— 在运行中修改程序状态,从而验证对某个 Bug 的修复思路,再继续排查其他问题。
1. 编译与启动
使用 GDB 调试前,编译时必须加 -g 选项以包含调试信息:
gcc -g -o a.out hello.c
启动 GDB:
gdb ./a.out
2. 常用命令速查表
2.1 查看代码
| 命令 | 缩写 | 说明 |
|---|---|---|
list |
l |
显示当前位置附近的源代码(默认 10 行) |
list 20 |
l 20 |
显示第 20 行附近的源代码 |
list main |
l main |
显示 main 函数的源代码 |
2.2 断点管理(Breakpoint)
| 命令 | 说明 |
|---|---|
break main / b main |
在 main 函数入口设置断点 |
break 15 / b 15 |
在第 15 行设置断点 |
break if i==5 |
条件断点,当 i==5 时触发 |
info break / info br |
查看所有断点信息 |
delete 1 / d 1 |
删除编号为 1 的断点 |
disable 1 |
禁用编号为 1 的断点 |
enable 1 |
启用编号为 1 的断点 |
2.3 运行与调试
| 命令 | 缩写 | 说明 |
|---|---|---|
run |
r |
运行程序(遇到断点自动停下) |
next |
n |
单步执行(不进入函数内部) |
step |
s |
单步执行(进入函数内部) |
continue |
c |
继续运行直到下一个断点 |
finish |
— | 运行到当前函数返回 |
quit |
q |
退出 GDB |
2.4 查看变量与内存
| 命令 | 说明 |
|---|---|
print var / p var |
打印变量 var 的值 |
print/x var |
以十六进制打印变量 |
display var |
每次暂停时自动显示变量值 |
info locals |
查看当前函数的所有局部变量 |
backtrace / bt |
查看函数调用栈 |
2.5 其他实用功能
| 命令 | 说明 |
|---|---|
shell <command> |
在 GDB 内执行 shell 命令,如 shell cat hello.c |
watch var |
设置观察点(Watchpoint),变量被修改时暂停 |
set var = value |
在调试过程中修改变量的值 |
3. Core Dump 分析
当程序发生段错误(Segmentation Fault)时,系统可以生成 core dump 文件用于事后分析。
3.1 触发 core dump 的示例代码
#include <stdio.h>
int main(void)
{
int *p = NULL; // 指针初始化为 NULL
*p = 0x10; // 解引用空指针 → 段错误(Segmentation Fault)
return 0;
}
3.2 开启 core dump
# 取消 core 文件大小限制
ulimit -c unlimited
# 设置 core 文件的命名格式(包含程序名、PID、信号编号)
echo ./core-%e-%p-%s > /proc/sys/kernel/core_pattern
3.3 使用 GDB 分析 core dump
gdb ./a.out core-a.out-12345-11
进入 GDB 后,使用 bt(backtrace)即可查看崩溃时的调用栈,快速定位问题所在。
4. 调试正在运行的进程
如果程序已经在运行,可以通过 PID 附加调试:
# 后台运行程序
./a.out &
# 输出类似:[1] 135852
# 附加 GDB 到该进程
gdb -p 135852
附加后即可正常使用 GDB 的所有调试命令。