常用命令
显示信息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