GDB调试详解

GDB是GNU组织在Linux系统中发布的程序调试器,它功能强大,使用方便,已经成为Linux系统中C/C++程序调试必备的工具。

GDB命令

一般来说,GDB能完成一下几个方面的工作。

  • 调试程序:支持代码级别的调试,可以一行一行地执行程序。
  • 动态断点设置:可以动态设置断点,甚至设置条件表达式,并自定义程序停止或运行。
  • 检查运行状态:提供丰富的检查机制,能够查看变量、内存等资源的使用。
  • 执行环境动态改变:支持动态改变程序的执行环境。
启动
  1. 一种是在启动的时候输入gdb filename,其中filename是可执行文件名,可以自动加载被调试的文件;
  2. 其次是在启动gdb之后,输入file filename,其中file是gdb内置的命令,用于指明要加载的调试文件。
  3. 在启动的时候如果加上-q参数,则不显示gdb的版权logo等信息
退出

退出gdb的命令是quit,输入quit后即可完全退出gdb,有时候可能需要值终止被调试的可执行程序,这时候可以输入kill命令,kill的意义是终止当前正在调试的程序。

分类

gdb命令可以分为5类:

  • 运行环境设置与查看
  • 断点设置与恢复
  • 源码查看
  • 程序数据查看
  • 运行参数设置
运行环境设置与查看

运行环境设置与查看包括在gdb中设置环境变量、查看环境变量、设置程序运行的路径、查看已设的路径、设置工作目录、查看工作目录、Shell命令等。

参数名意义
set environment var [=value]设置环境变量,其中var是环境名,value为变量的值
show environment [var]查看环境变量
path dirpath设置程序的运行路径
show path查看程序运行路径
cd dir设置工作目录,其中dir为工作目录名
pwd查看工作目录
shell command支持shell命令,其中command为命令名
断点设置与恢复

断点设置与恢复是程序调试中最频繁的操作,gdb提供类丰富的断点设置与恢复调试命令。

参数名意义
break [断点名]设置断点,断电名可以是行号、函数名,甚至是条件表达式
tbreak [断点名]与break类似,不同的地方在于断点执行过后辉自动取消该断点
step单步运行,若有函数调用,会进入函数内部
next单步运行,若有函数调用,不会进入函数内部
continue继续运行,直到下一个断点或程序结束
finish运行程序,直至当前函数完成,并打印函数返回时的堆栈地址、返回值及参数值等信息
delete [断点名]删除指定断点
disable [断点名]停止指定的断点
enable [断点名]恢复指定被disable停止的断点
clear清楚所有断点,若delete不适用参数,可达到同样的效果
bnfor [断点名]查看所设的断点
ignore [断点名][n]对指定的断点忽略n次,n为常数
condition [断点名]<表达式>为指定的断点修改条件表达式
源码查看

为方便程序的调试,用户可以调用源码查看命令,随时查看指定位置的源码。

参数名意义
list [var]列出当前源码,var可以是行号,也可以是函数名
info line查看gdb中加载到内存中的源码
forware-search正则表达式,从当前位置向前搜索满足条件的源代码
reverse-search正则表达式,从当前位置向后搜索满足条件的源代码
程序数据查看

程序数据查看是在调试程序时,查看相关变量或表达式的值。

参数名意义
print [var]输出表达式或者变量的值
x [n/f/u]输出内存变量的数据,其中n为长度,f为格式,u为从当前位置向后的长度
watch [var]为变量var设置观察点,若变量值有变化,则停止程序
rwatch [var]为变量var设置观察点,若变量值被读取时,停止程序
awatch [var]为变量设置观察点,当变量的值被修改时,停止程序
info watchpoint显示所有的观察点
display [var]显示表达式或变量的值
运行参数设置

运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。

参数名意义
set args制定程序运行时的参数以及值
show args显示运行参数值
set var = value为程序中制定的变量设置值
disasseble
/m 源码和汇编一起排列
/r 查看16进制

用x/i查看
x/15i main

$pc 指向当前程序运行地址
x/5i $pc

disasseble $pc
display/i $pc
x/i $pc

查看寄存器的植
p $rax

help layout

在gdb中,运行程序使用r或者run命令

程序运行参数
set args 可指定运行时参数
show args 查看设置好的运行参数

info terminal 显示你程序用到的终端的模式

调试已运行的程序

gdb PID <进程id>

或者先关联源码,在gdb中用attach <进程id>。并用detach来取消挂载的进程

调试程序中,暂停程序时是必须的,GDB可以方便地暂停程序的运行。你可以设置程序
在哪停住以便查看运行时的变量,以及运行时的流程。

当进程被gdb暂停时,可以使用info program来查看程序是否在运行,进程号以及被暂停的原因

在gdb中,可以有以下几种暂停方式:
断点(BreakPoint),观察点(WatchPoint),捕捉点(CatchPoint),信号(Signals),线程停止(Thread Stops)

如果要恢复程序运行,可以使用c或者continue命令。

使用“disable 断点号”命令可以使某个断点失效,程序运行到该点不会停下而是继续运行,使用“enable 断点号”命令可以让某个断点恢复有效。

gdb -q <程序名> # -q参数去除版权信息

查看内存数据

x/<n/f/u> <addr> # n f u是可选参数

n

n 是一个正整数,表示需要读取的内存单元的个数,也就是说从当前地址向后显示内存单元的内容,一个内存单元的大小由后面的u定义

f

f 表示显示的格式

x 十六进制格式
d 十进制格式
u 无符号十进制格式
o 八进制格式
t 二进制格式
c 字符格式
f 浮点数格式

u

u表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是4个字节

b 表示单字节
h 表示双字节
w 表示四字节
g 表示八字结

当我们指定了单位长度后,gdb会从指定的内存地址开始,读写n个单元

单步执行
s是step,n是next,step会进入函数,next会跳过函数

si,ni是汇编级别的调试
s,n是c语言级别的调试

断点

查看所有的断点

i b

删除断点

delete # 删除所有断点
delete <num> # 指定断点删除

在这里插入图片描述
Intel汇编格式显示

set disassemebly-flavor intel

在这里插入图片描述

disassemble /r

汇编以及16进制数据一起显示

在这里插入图片描述

disassemble /m

连同源码一起显示
在这里插入图片描述

$pc # 执行当前程序的运行地址, 也就是eip的值
p $pc 

在这里插入图片描述

查看源码

show listsize

在这里插入图片描述

set listsize count 设置list命令显示的源代码数量最多为count行,0表示不限制行数
show listsize 显示listsize的值

set disassembyl-flavor intel 默认值是att
set disassemble-next-line on/off/auto 当程序停下来的时候,是否显示下一行源代码的汇编代码,默认为off
show disassemble-next-line 显示disassemble-next-line的值

显示指定位置的源代码
可以是行号,函数名,地址

list linenum
list function
list *addr
list 3, 7

where/bt 查看运行的堆栈列表
bt backtrace 显示当前调用堆栈

show args 查看设置好的参数
info program 查看程序状态,是否在运行等等

next 执行下一步(如果遇到函数不会进入函数)
next n 执行n次下一步
step 单步执行下一步

finish 执行完当前函数返回到调用它的函数
return 立即结束当前函数的运行,即跳过接下来的语句,可带参数,即指定任意返回值

until 执行完当前循环体

info registers 查看当前寄存器的值
在这里插入图片描述
info program
在这里插入图片描述

whatis <var>
info locals

在这里插入图片描述

print
display

参考:https://www.jianshu.com/p/c3e5f5972b21

更多参考:https://blog.csdn.net/niyaozuozuihao/article/details/91802994

https://www.gnu.org/software/gdb/documentation/
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值