gdb常用命令,多线程,多进程

常用命令

显示信息info,缩写i

i b :显示断点信息
i locals :显示函数中全部的局部变量
i args :显示函数参数
i threads :显示线程信息

设置断点break,缩写b

b [文件名:行号 ]: 设置断点
rb [断点]:设置正则断点
tb [断点]:设置临时断点,就断一次
i b :显示所有断点
delete [num]: 删除某个断点
b if [条件]:条件断点,满足条件才断住

查看调用栈

bt:打印调用栈
frame [num]:转到某个帧

结束函数

finish:结束函数

跳过函数

skip 函数名:跳过某个函数
与s(单步执行)配合使用,比如if中嵌套多个函数,不想进入某个函数

执行外部命令

![命令]
shell [命令]
执行外部命令

观察点

watch [变量/变量表达式]:写观察点,对这个变量执行写操作的时候会打印信息
rwatch [变量/变量表达式]:读观察点,对这个变量执行读操作的时候会打印信息
awatch [变量/变量表达式]:读写观察点,对这个变量执行读操作或读操作的时候会打印信息

捕获点

catch 动作:执行到某个动作的时候打印
在这里插入图片描述

查看内存

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

f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节。
当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

举例:
x/8x 0x18643900:n=8,f=x,u=默认值4个字节,表示从0x18643900这个地址读取内容,以4字节为单位,往后读取8个单位,读出来的数据用16进制显示
x/8db 0x18643900:n=8,f=d,u=b,表示从0x18643900这个地址读取内容,以1字节为单位,往后读取8个单位,读出来的数据用10进制显示
x/8xb 0x18643900:n=8,f=x,u=b,表示从0x18643900这个地址读取内容,以1字节为单位,往后读取8个单位,读出来的数据用16进制显示
查看内存
这里注意大小端转换

查看寄存器信息

i registers(缩写 r):查看所有寄存器的值
i r [寄存器]:查看某个寄存器的值
查看寄存器信息
pc/rip 存放程序下一条要执行的指令,可以修改寄存器set var $pc=xxx的值达到跳转到某行执行,或重复执行的效果

查看代码信息

l 行数:显示这一行的代码信息
l 函数名:显示这个函数的代码信息
l 地址:显示这个地址的代码信息
disassemble :反汇编代码
代码信息

线程调试

线程信息

i threads:显示所有线程,带*号的是当前线程
thread [num]:切换到某个线程
b [断点] thread [num]: 为线程设置断点,只有指定线程会断到这个断点

thread apply (1,2,all…)[命令]:对应(1号,2号,全部…)线程执行某命令
比如:thread apply 18 finish:对18号线程执行finish命令
查看线程死锁的时候可以使用thread apply all bt 查看各线程的调用栈

set print thread-events off :关闭打印线程时间

多进程同时调试

调试单个进程

gdb -p [pid]
gdb attach [pid]

调试多个进程

set detach-on-fork on/off :调用fork后相关进程的运行行为是分离出去独立运行,不受gdb控制还是不分离,被阻塞住

follow-fork-mode [parents/child] :就是fork之后,gdb的控制落在谁身上,如果是父进程,那么分离的就是子进程,反之亦然

info inferiors :查看进程信息
inferior [num] : 切换进程

另一种方式:
进入gdb,查看进程号,attach一个进程
在这里插入图片描述
add-inferior 添加一个inferior

查看inferiors,可以看到1号inferior已经是1838进程,这时候再添加一个inferior,将另一个进程attach
在这里插入图片描述
此时,查看inferior信息,已经有2个进程attach,*号所在的是当前进程,如果要切换,使用 inferior [num] : 切换进程
在这里插入图片描述
参考:https://www.cnblogs.com/thammer/p/5833935.html

https://blog.csdn.net/allenlinrui/article/details/5964046

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值