GNU Debugger - 程序调试利器
GDB(GNU Debugger)是Linux下最强大的调试工具,可以帮助你找出程序中的bug。
# 编译时添加调试信息
g++ -g main.cpp -o main
# 同时使用所有警告和调试信息
g++ -Wall -Wextra -g -std=c++17 main.cpp -o main
必须使用 -g 选项编译,GDB才能显示源代码和变量信息!
| 命令 | 缩写 | 说明 |
|---|---|---|
| run | r | 开始运行程序 |
| break | b | 设置断点 |
| continue | c | 继续运行 |
| next | n | 单步执行(不进入函数) |
| step | s | 单步执行(进入函数) |
| p | 打印变量值 | |
| display | disp | 自动显示变量 |
| quit | q | 退出GDB |
使用下方控制面板模拟GDB调试过程:
# 在函数开始处设置断点
(gdb) break main
# 在指定行设置断点
(gdb) break 10
# 在文件指定行设置断点
(gdb) break main.cpp:15
# 查看所有断点
(gdb) info breakpoints
# 删除断点
(gdb) delete 1 # 删除编号为1的断点
# 打印变量值
(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
# 查看调用栈
(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 | 中断程序 |
g++ -g -Wall main.cpp -o maingdb ./mainbreak mainrunnext 或 stepprint 变量名continuequit