gdb 用法详解
gdb调试简介
gdb是linux下非常好用的一个调试工具,由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,gdb 对于一名Linux下工作的c/c++程序员,是必不可少的工具。
安装gdb
输入以下命令,确保在联网状态下。
yum install gdb
之后,系统就会自动下载安装,等待即可。
顺便提一句,以下命令可以查看gdb的安装版本
gdb --version
gdb的常用命令
- 编译可执行文件
首先编写一个简单的测试程序并保存,然后使用gcc将其编译为可执行文件,同时使用 -g 表示该程序可调试:
gcc -g test.c -o test
在gcc默认形成的可执行程序是 release ,是无法被调试的。-g 选项告诉 gcc 在编译程序时加入调试信息,使其能够被gdb调试。
如果没有这个选项就会报错:No symbol table is loaded. Use the “file” command
- 启动调试
输入gdb -q + 可执行文件,启动gdb进行调试,q参数可以屏蔽一些 gdb 版本等相关信息。
gdb hello
//或者
gdb -q hello
- 查看代码
gdb list //简写为 gdb l
gdb l 0 //从第一行开始显示代码
- gdb l 查看代码
- gdb l 0 从第一行开始显示代码
gdb 会自动记录上一次执行的代码
- 执行程序
//在 gdb 模式下,输入r进入调试
r
- 设置断点
输入 break(b)+数字 可以对程序进行断点操作,数字就是设置断点的代码行数
b 18 //打断点
b mycode.c:20 //对 mycode.c 中的20行打上断点
b main //对主函数打断点
b mycode.c:Add // 对 mycode.c 文件中的 Add 函数打断点
gdb 既可以对行号打断点,也可以对函数打断点。
执行效果如下:
- 删除断点
- 输入 d + 断点序号
d 1 //删除1号断点
执行完该命令后,1 号断点就会被删除,并且 gdb 不会有任何提示。
- 删除全部的断点
d breakpoints //删除所有断点
此命令会有提示,询问是否确定删除全部的断点。输入 y ,表示确定删除。
- 清除第n行的断点
clear + n
- 禁用/启用断点
disable 1 //禁用 1 号断点
enable 1 //启用 1 号断点
disable 1,禁用了一号断点。我们再来查看断点信息可以发现,1 号断点的Enb变为了n。而不是之前的y。
此时再启用断点 1
可以看到之前被禁用的断点1 ,现在又变为启用状态。
- 查看断点信息
查看断点,每个断点都有依次的编号
info b //查看断点,每个断点都有依次的编号
执行效果如下
各个信息的解释
- Num:断点编号
- Disp:断点执行一次之后是否有效(keep:有效 dis:无效)
- Enb: 当前断点是否有效 (y:有效 n:无效)
- Address:内存地址
- What:位置
ps:在一次 gdb 的调试周期中,断点的编号是会依次上升的,期间删除断点行号并不会重新排列,一旦退出,断点就会自动消失
例如:
这里可以看到这里把 2 号断点删除之后重新查看断点的信息。其余两个断点并没有重新排列成 1 和 2,而是依旧维持原有的序号排列。
这里可以说明 gdb 在单次调试周期中。断点的编号是依次上升。且删除断点不会改变其他断点的原有编号。
- 单步执行
-
next ( n ) :单步执行程序,但是遇到函数时会直接跳过函数,不进入函数
-
step ( s ):单步执行程序,但遇到函数会进入函数
-
continue ( c ):继续执行程序,直到遇到断点或结束
可以看到执行效果如下:
- 查看变量
-
print + 变量:查看变量值
-
whatis + 变量:查看变量数据类型
print的执行效果:
其中输入 print 或 p 都可以。
whatis i 查看变量类型:
- 退出
输入q回车即可退出gdb调试模式。
其他命令
- 运行命令
命令 | 作用 |
---|---|
until | 可以在一个循环内运行程序直到退出循环体 |
until + 行号 | 运行至某行 |
finish | 运行程序,直到当前函数返回完成,并且打印函数返回时的堆栈地址和返回值及参数值等信息 |
call + 行数 + (参数) | 调用程序中可见的函数,并传递参数 |
- 运行信息
命令 | 作用 |
---|---|
where / bt | 当前运行的堆栈列表 |
bt backtrace | 显示当前调用堆栈 |
up / down | 改变堆栈显示的深度 |
set args + 参数 | 指定运行时的参数 |
show args | 查看设置好的参数 |
info program | 查看程序是否在运行,以及进程号被暂停的原因 |