gdb调试
GDB(GNU调试器)是Linux下非常强大、常用的调试工具。它可以帮你跟踪程序运行状态、查找bug、分析程序崩溃原因等。
一、什么是GDB?它能做什么?
**GDB(GNU Debugger)**是一个调试工具,类似于程序的“监控器”和“助手”。它可以让你:
- 暂停程序在某个位置(设置断点)
- 逐句运行程序(单步执行)
- 查看变量的值
- 改变变量的值
- 跟踪程序的调用栈(函数调用顺序)
- 发现程序崩溃的原因(核心转储分析)
简单说,GDB帮你观察和操控程序的执行流程,找出问题所在。
二、使用准备:确保程序可以调试
1. 编译带调试信息
如果要用GDB调试,你的程序必须“加上调试符号”。这是在编译时加入的特殊信息,让GDB知道代码和源文件对应关系。
比如,用gcc
编译:
gcc -g program.c -o program
-g
意味着加入调试信息。
你不用加优化(-O
)参数,否则调试起来会比较难。
三、基本的GDB流程(入门指南)
1. 启动GDB
在终端输入:
gdb ./program
这样就开启了调试环境。
2. 设置断点(暂停点)
断点是让程序在某行停下来,方便检查。
设置断点 比如在main
函数第一行:
(gdb) break main
或者在具体文件的某一行:
(gdb) break 15
意思是在第15行停。
3. 运行程序
(gdb) run
程序会从起点开始运行,到遇到第一个断点暂停。
你可以给程序传参数:
(gdb) run arg1 arg2
4. 程序暂停后(断点处)
可以用多种命令看变量、单步执行等。
四、常用操作详细介绍
操作 | 命令 | 作用说明 |
---|---|---|
启动调试环境 | gdb ./program | 打开调试工具,载入程序 |
设置断点 | break function | 在函数开头设置断点(比如break main ) |
break filename:line | 在特定源文件的某一行设置断点 | |
运行程序 | run | 开始运行程序,遇到断点停止 |
继续运行 | continue | 程序暂停后,继续运行至下一个断点或结束 |
单步执行(逐句执行) | step | 进入函数内部执行下一行(如果有函数,逐步进去) |
next | 单步执行,但不进入函数内部 | |
查看变量 | print variable_name | 查看变量的值(比如print x ) |
观察所有变量 | info locals | 列出当前函数的所有局部变量 |
查看调用栈(函数调用历史) | backtrace 或 bt | 查看当前函数的调用链,帮助找出崩溃点 |
改变变量的值 | set variable_name=值 | 改变变量的值,测试不同场景 |
删除断点 | delete breakpoint_number | 删除断点(比如delete 1 删除第1个断点) |
查看所有断点 | info breakpoints | 查看已设置的断点信息 |
退出调试 | quit | 退出GDB,结束调试 |
五、调试实例(示范:调试一个简单程序)
假设你有这样一个程序test.c
:
#include <stdio.h>int main() {int a=5, b=0;printf("a=%d, b=%d\n", a, b);int c = a / b; // 这里会崩溃:除以零printf("结果:%d\n", c);return 0;
}
编译:
gcc -g test.c -o test
调试:
gdb ./test
调试流程:
(gdb) break main # 在main函数起点断开
(gdb) run # 运行到断点
(gdb) print a # 查看变量a的值
(gdb) print b # 查看b
(gdb) step # 进入下一行(算表达式)
(gdb) next # 执行下一行,不进入函数
(gdb) continue # 继续运行直到崩溃或遇到下个断点
程序会崩溃(除零错误),GDB会停止在出问题的地方,你可以用bt
查看调用栈。
六、实用技巧和注意事项
- 用quit退出:输入
quit
或者q
退出GDB - 查看源代码:在调试时一定要确保源文件在调试目录
- 多线程调试:GDB支持多线程,但需要了解线程的命令
- 断点条件:比如:只在某变量满足条件时停
(gdb) break filename:line if x==10
- 支持远程调试:可以调试嵌入式设备(需要特殊配置)
七、总结
重点 | 内容 |
---|---|
为什么用GDB | 查bug、理解程序流程、动态修改变量 |
如何启动 | gdb ./程序 |
常用命令 | break 、run 、print 、step 、next 、continue 、bt |
需要准备 | 加-g 参数编译,源代码清楚 |
调试技巧 | 设置条件断点、查看调用栈、修改变量值 |