文章目录
GDB
GDB概述
什么是GDB
GDB是GUN开源组织发布的一款强大的Unix/Linux的程序调试工具
GDB的主要功能
1.启动程序,按照程序员要求运行程序。
2.可以让程序在程序员设置的断点处停下来。
3.在程序停止的情况下,可查看程序中的变量等信息。
4.动态改变程序的运行环境。
需要注意的是:
程序在编译的时候需要跟上 -g参数,因为我们默认编译出来的版本是发布版本(Release),会删除一切调试可用信息,便于减小可执行程序的体积,但是我们调试的时候,我们需要保留调试信息,所以需要使用到调试版本(DeBug),所以需要指定参数 -g
GDB的启动
GDB常见的启动方式
在命令行中运行:
(1)gdb
:
c
file <filename>
如果调试的程序需要命令行参数还需要执行如下指令:
c
set args arg1 arg2 ...
(2)gdb <filename>
如果调试的程序需要命令行参数则执行如下格式指令:
c
gdb --args <filename> arg1 arg2 ...
GDB的退出
在gdb中执行命令:
c
quit / q
GDB的常用命令
GDB查看源代码指令---------list(1)
显示指定位置的周围的源代码;可以通过行号、文件名、函数名以及三者之间的组合来定位指定位置,显示代码的行数可以通过设置listsize来设定,但是该设置只是本次有效;简化命令:l
shell
set listsize 20 # 每次list显示指定区域的20行代码,默认10行
show listsizelist linenumber # 显示 linenumber附近的代码
list 50 # 显示当前源文件的第50行的附近代码
list function # 显示函数代码
list test.c:30 # 显示指定源文件的第30行的附近代码
list +/- # 向后/前显示源代码
list <first>,<last> # 显示first ,last之间的内容
list 100,200
GDB 查看设置**------info**
shell
info registers # 查看寄存器信息
info frame # 查看栈信息(帧信息)
info locals # 显示当前函数的所有局部变量名及其值
info break/b # 查看断点信息
info args # 显示当前函数的参数名及其值
info prog # 查看调试程序的执行状态
info files # 显示调试文件的详细信息
GDB 查看内存
shell
查看内存变量的值 print (p)
p i
p function::i
自动显示的变量值或表达式值 display
display i # 自动显示变量i的值
info display # 查看自动显示变量的信息
undisplay 1 2 # 取消1,2号自动变量显示
disable display 1 # 暂停显示1号自动变量
enable display 1 # 回复显示1号自动变量
GDB 设置断点**---break (b)**
SHELL
设定程序在运行过程中在指定的位置停下来,该指定的位置可以为源文件名、函数名、行号中的一个或多个组合的具有唯一性地址
break/b linenum # 通过文件行号设置断点 b 20
break/b funcname # 通过函数名设置断点 b add
break/b linenum if exp # 设置条件断点: b 20 if i==8
断点维护:
info break # 查看断点信息
delete break 1 # 删除编号为1的断点,不带参数删除所有断点
enable break 1 # 启用编号为1的断点,断点信息enb 变为 y
disable break 1 # 禁用编号为1的断点,断点信息enb 变为 n
clear linenum # 清除linenum行上所有断点
GDB 设置观察点**---watch**
shell
watchpoint 观察点,当观察对象的值变化时,会停止程序
watch <exp> # 为表达式或变量设置观察点,一旦值变化停止程序
rwatch <exp> # 当表达式或变量被读时,停止程序
awatch <exp> # 当表达式或变量被读,写时,停止程序
info watchpoints # 查看所有观察点信息
观察点可认为是特殊的断点
GDB 程序调试
shell
启动程序: run # 从main开始运行
continue # 一直执行直到满足停止条件而停止
next/n # 单步执行,遇到函数不进入
step/s # 单步执行,遇到函数进入
finish # 执行当前函数的剩余指令,直到函数返回
GDB完整使用演示
检查你的Linux 支不支持GDB
我们一般检测,都是通过查看版本的方式,如果版本能查到,就说明支持,查询不到说明不支持
c
gdb --version
我们可以通过网络在线安装
c
sudo apt-get install gdb
启动GDB
启动GDB
c
gdb
打开需要调试的文件
(1) 针对没有运行参数(main函数参数无需接收)的可执行程序
c
file 2
上面的命令等价于:
c
gdb 2
(2) 针对有运行参数(main函数参数需要接收)的可执行程序
c
set a.txt b.txt ...
显示调试的代码
设置显示的行数
c
set listsize 20 // 设置显示的行数,默认显示10行
设置从哪一行开始显示
c
list 1 / l 1 // 1就是起始行号
设置调试断点
设置断点
设定程序在运行过程中在指定的位置停下来,该指定的位置可以为源文件名、函数名、行号中的一个或多个组合的具有唯一性地址
c
break/b linenum # 通过文件行号设置断点 b 18
break/b funcname # 通过函数名设置断点 b sum
break/b linenum if exp # 设置条件断点: b 20 if i==8
清除断点
c
info break # 查看断点信息
delete break 1 # 删除编号为1的断点,不带参数删除所有断点
clear linenum # 清除linenum行上所有断点 clear 18
调试代码
运行程序
c
run # 从main开始运行
continue # 一直执行直到满足停止条件而停止
next/n # 单步执行,遇到函数不进入
step/s # 单步执行,遇到函数进入
finish # 执行当前函数的剩余指令,直到函数返回
打印输出
c
查看内存变量的值 print (p)
print/p i # 打印输出变量等数据
自动显示的变量值或表达式值 display
display i # 自动显示变量i的值
退出GDB
c
quit / q