一.什么是gdb和cgdb
GDB:GNU Debugger,GNU 官方调试器,Linux 下命令行程序调试工具
只能调试带调试信息 的程序,编译时必须加
-g参数
gcc test.c -o test -g
gdb 作用
- 设置断点,程序运行到断点自动停下
- 单步执行,一行一行跑代码
- 查看变量值、查看内存、查看调用栈
- 分析程序崩溃,定位段错误 (segment fault)
cgdb = gdb 的前端界面,gdb 的外壳,底层还是调用 gdb
- gdb 是纯黑框,代码和调试命令混在一起,阅读不方便
- cgdb 分双窗口:上方显示源代码,下方是 gdb 命令行,界面更友好,看代码更舒服
安装:
yum install cgdb
启动:
cgdb ./test
快捷键:按
esc切换源码窗口,按i切回下方 gdb 命令输入框,所有 gdb 命令在下方照常使用。
| 工具 | 特点 |
|---|---|
| gdb | 原生调试器,纯命令行,无代码预览窗口,所有环境自带 |
| cgdb | gdb 图形前端,分屏显示源码,可读性强,需要额外安装 |

我们也可以在makefile中添加-g

由于gdb不能直观显示,所以我们用cgdb来操作
二.gdb的命令学习
首先进入调试:gdb/cgdb + 编译后的文件名

退出是:quit 或 ctrl + d
1.通过命令进入界面是上面的情形,这时按esc然后ctrl + w可以切换为左右界面

2.若光标不在调试那里显示按i可以切换的左边,esc切换到左边;上下界面同理
3.b+函数名在函数的起始行进行标记;b+行号 在该行进行标记

GDB 常用命令速查表
2.1 查看源码(list)
| 命令 | 作用 | 样例 |
|---|---|---|
list / l |
显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
list/l 函数名 |
列出指定函数的源代码 | list/l main |
list/l 文件名:行号 |
列出指定文件的源代码 | list/l mycmd.c:1 |
2.2 运行与单步调试
| 命令 | 作用 | 样例 |
|---|---|---|
r / run |
从程序开始连续执行 | run |
n / next |
单步执行,不进入函数内部(逐过程 F10) | next |
s / step |
单步执行,进入函数内部(逐语句 F11) | step |
finish |
执行到当前函数返回,然后停止 | finish |
c / continue |
从当前位置开始连续执行程序 | continue |
until X行号 |
执行到指定行号 | until 20 |
2.3 断点管理
| 命令 | 作用 | 样例 |
|---|---|---|
break/b [文件名:]行号 |
在指定行号设置断点 | break 10 / break test.c:10 |
break/b 函数名 |
在函数开头设置断点 | break main |
info break/b |
查看当前所有断点的信息 | info break |
info/i breakpoints |
查看当前设置的断点列表 | info breakpoints |
delete/d breakpoints |
删除所有断点 | delete breakpoints |
delete/d breakpoints n |
删除序号为n的断点 | delete breakpoints 1 |
disable breakpoints |
禁用所有断点 | disable breakpoints |
enable breakpoints |
启用所有断点 | enable breakpoints |
2.4 变量查看与修改
| 命令 | 作用 | 样例 |
|---|---|---|
print/p 表达式 |
打印表达式的值 | print start+end |
p 变量 |
打印指定变量的值 | p x |
set var 变量=值 |
修改变量的值 | set var i=10 |
display 变量名 |
跟踪显示指定变量的值(每次停止时) | display x |
undisplay 编号 |
取消对指定编号的变量的跟踪显示 | undisplay 1 |
info/i locals |
查看当前栈帧的局部变量值 | info locals |
2.5 调用栈与退出
| 命令 | 作用 | 样例 |
|---|---|---|
backtrace/bt |
查看当前执行栈的各级函数调用及参数 | backtrace |
quit |
退出GDB调试器 | quit |


注意:当我们使用step时,遇到库函数要用n否则会跳入库函数里面一步一步执行






补充:
1.watch命令
执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB会暂 停程序的执⾏,并通知使⽤者


2.set var:暂时更改标志位,便于查看
3.条件断点
