GDB调试工具

GNU Debugger - 程序调试利器

GDB概述

GDB(GNU Debugger)是Linux下最强大的调试工具,可以帮助你找出程序中的bug。

为什么需要GDB?

  • 查看运行时状态:在程序运行时查看变量值
  • 单步执行:一行一行执行代码,观察程序流程
  • 设置断点:在指定位置暂停程序
  • 分析崩溃:找出段错误(Segmentation Fault)的原因

编译调试版本


# 编译时添加调试信息
g++ -g main.cpp -o main

# 同时使用所有警告和调试信息
g++ -Wall -Wextra -g -std=c++17 main.cpp -o main
                

重要提示

必须使用 -g 选项编译,GDB才能显示源代码和变量信息!

GDB基本命令

命令 缩写 说明
runr开始运行程序
breakb设置断点
continuec继续运行
nextn单步执行(不进入函数)
steps单步执行(进入函数)
printp打印变量值
displaydisp自动显示变量
quitq退出GDB

交互式调试演示

使用下方控制面板模拟GDB调试过程:

$ gdb ./main
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Reading symbols from ./main...
(gdb)

源代码窗口

1#include <iostream>
2using namespace std;
3
4int main() {
5 int sum = 0;
6 for (int i = 1; i <= 5; i++) {
7 sum += i;
8 cout << i << " ";
9 }
10 cout << endl;
11 cout << "sum = " << sum << endl;
12 return 0;
13}

变量监视

sum ?
i ?

常用调试场景

1. 设置断点


# 在函数开始处设置断点
(gdb) break main

# 在指定行设置断点
(gdb) break 10

# 在文件指定行设置断点
(gdb) break main.cpp:15

# 查看所有断点
(gdb) info breakpoints

# 删除断点
(gdb) delete 1  # 删除编号为1的断点
                

2. 查看变量


# 打印变量值
(gdb) print sum
$1 = 15

# 查看变量类型
(gdb) whatis sum
type = int

# 格式化输出
(gdb) print/x sum      # 十六进制
(gdb) print/t sum      # 二进制
(gdb) print/o sum      # 八进制

# 自动显示变量(每次停止时自动显示)
(gdb) display sum
(gdb) display i
                

3. 查看调用栈


# 查看调用栈
(gdb) backtrace
#0  functionB () at main.cpp:20
#1  functionA () at main.cpp:10
#2  main () at main.cpp:5

# 切换栈帧
(gdb) frame 1
# 查看上一帧的局部变量
(gdb) info locals
                

调试段错误

定位段错误

当程序崩溃时,使用以下命令找出问题:


# 运行直到崩溃
(gdb) run
...
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401140 in main () at main.cpp:8
8       arr[10] = 5;  # 访问了非法内存

# 查看当前位置的代码
(gdb) list

# 查看崩溃时的变量
(gdb) print i
$1 = 10

# 查看调用栈
(gdb) backtrace
                    

实用技巧

条件断点


# 只在i等于5时暂停
(gdb) break main.cpp:7 if i == 5

# 只在sum大于100时暂停
(gdb) break main.cpp:11 if sum > 100
                    

监视点


# 当变量值改变时暂停
(gdb) watch sum

# 查看所有监视点
(gdb) info watchpoints
                    

常用快捷键

快捷键 功能
Enter重复上一条命令
Ctrl + L清屏
Ctrl + C中断程序

推荐工作流程

  1. 编译:g++ -g -Wall main.cpp -o main
  2. 启动GDB:gdb ./main
  3. 设置断点:break main
  4. 运行:run
  5. 单步调试:next 或 step
  6. 查看变量:print 变量名
  7. 继续运行:continue
  8. 退出:quit