文章目录
调试示例
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 + p | layout 之后,可以通过其获取前一条执行命令或后一条执行命令 |
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 | 在程序运行的内存地址处停住。 |
break | break命令没有参数时,表示在下一条指令处停住。 |
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
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