GDB 调试器使用指南

GDB 调试器使用指南

GDB(GNU Debugger)是 Linux 下最常用的 C/C++ 程序调试工具。GDB 主要能做以下四件事来帮助你定位 Bug:

  1. 启动程序 —— 可以指定任何可能影响程序行为的参数与环境。
  2. 条件中断 —— 让程序在满足指定条件时停下来。
  3. 检查现场 —— 程序停下后,检查当时究竟发生了什么。
  4. 动态修改 —— 在运行中修改程序状态,从而验证对某个 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 的所有调试命令。


5. 参考资料