【调试手段】GDB调试

调试示例
gdb ./demo
(gdb) set args 11 22  ;demo执行时命令参数为 ./demo 11 22
(gdb) start
(gdb) b 1201
(gdb) info b
(gdb) c
(gdb) step
(gdb) finish
(gdb) layout src
(gdb) list
(gdb) print a
(gdb) print $r0
(gdb) q

1、调试流程
1.1 C-style

(gdb) r(un)
(gdb) n(ext)
(gdb) s(tep)
(gdb) c(ontinue)

1.2 汇编style

(gdb) n(ext)i
(gdb) s(tep)i

2、GDB Layout的使用
Command作用
display /i $pc命令可以在调试时显示每条汇编命令。
info win显示窗口的大小
layout next切换到下一个布局模式
layout prev切换到上一个布局模式
layout src只显示源代码
layout asm只显示汇编代码
layout split显示源代码和汇编代码
layout regs增加寄存器内容显示
focus cmd/src/asm/regs/next/prev切换当前窗口
refresh刷新所有窗口
dir srcDir设置源码的搜索目录,srcDir指源码目录
tui reg next显示下一组寄存器
tui reg system显示系统寄存器
update更新源代码窗口和当前执行点
winheight name +/- line调整name窗口的高度
tabset nchar设置tab为nchar个字符
Ctrl + L刷新窗口
Ctrl + x再按1:单窗口模式,显示一个窗口
Ctrl + x再按2:双窗口模式,显示两个窗口
Ctrl + x再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。
Ctrl + n / Ctrl + playout 之后,可以通过其获取前一条执行命令或后一条执行命令
3、查询运行信息
Command作用
where/bt当前运行的堆栈列表
bt backtrace显示当前调用堆栈
up/down改变堆栈显示的深度
set args 参数指定运行时的参数
show args查看设置好的参数
info program来查看程序的是否在运行,进程号,被暂停的原因。
4、设置断点
Command作用
break < function >在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break 在指定行号停住。
break +offset / break -offset在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum在源文件filename的linenum行处停住。
break filename:function在源文件filename的function函数的入口处停住。
break *address在程序运行的内存地址处停住。
breakbreak命令没有参数时,表示在下一条指令处停住。
break … if < condition >…可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i==100,表示当i为100时停住程序。
delete [breakpoints][range]删除指定的断点,breakpoints为断点号,range表示断点号的范围

查看断点时,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]

5、输出格式

一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

(gdb) p i
$21 = 101   
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101

参考网址:https://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F

6、查看寄存器

(gdb) i r
(gdb) i r a # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc
查看所有的寄存器(Like NEON Q… on ARM): info all-registers
参考网址:https://stackoverflow.com/questions/5429137/how-to-print-register-values-in-gdb

以十进制的方式查看寄存器的值: p/d $pc 参考网址:https://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_54.html
7、查看内存

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/<n/f/u> <addr>
  • n、f、u是可选的参数。
  • n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
  • f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。
  • u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。

< addr >表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十进制显示。

8、以自动换行的方式打印结构体变量
以自动换行的方式打印结构体变量: set print pretty

参考网址:https://www.cnblogs.com/ims-/p/10529393.html

9、设置环境变量
PATH=$PATH:userpath

参考网址:http://www.yolinux.com/TUTORIALS/GDB-Commands.html
参考网址:http://www.akira.ruc.dk/~keld/teaching/CAN_e14/Readings/gdb.pdf
参考网址:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
参考网址:https://www.cnblogs.com/arnoldlu/p/9633254.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值