- 设置断点
break <函数名 / 行号>
- 查看断点
info breakpoints [list ...]
info break [list ...]
i b
- 清除断点
clear <行号>
- 查看当前执行及之后20行代码
display /20i $pc
- 使用gdb的TUI模式,调出汇编指令窗口配合调试。
layout asm
- finish 运行到当前函数结束再返回;return直接返回
- until + 行号,可以用来跳过循环
查看
info reg
(i r
)可以显示寄存器内容。
在寄存器名之前加$可以显示寄存器内容,
p $寄存器
:显示寄存器内容
p/x $寄存器
:十六进制显示寄存器内容。
用x命令可以显示内容内容,“x/格式 地址”。
x $pc
:显示程序指针内容
x/i $pc
:显示程序指针汇编。
x/10i $pc
:显示程序指针之后10条指令。
x/256wx 0xffffe1e0
:从0xffffe1e0开始以16进制打印256个word。
x/10w $esp
// 显示栈里的10个数据,其中左边第一列是栈地址。
x/s 0x0803020a
// 栈中字符串格式的内存地址(指针)
x/s $rdi
x/5i 0x0803020a
// 显示出这个地址开始的指令
x/10g $rsp
// 显示栈中的数值,g 代表 giant words.
X用法
x /<n/f/u> <addr>
n、f、u 都是可选的参数.
- n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
- f 表示显示的格式。
- u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
- <addr>表示一个内存地址。
参数 f 的可选值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
参数 u 的可选值:
- b 表示单字节
- h 表示双字节
- w 表示四字节
- g 表示八字节
示例
查看$rsi
地址的内存单元,以字符格式。
(gdb) x /20c $rsi
0x402000 <buf>: 79 'O' 75 'K' 10 '\n' -27 '\345' -91 '\245' -67 '\275' -17 '\357' -68 '\274'
0x402008: -116 '\214' -26 '\346' -120 '\210' -111 '\221' -27 '\345' -113 '\217' -85 '\253' -26 '\346'
0x402010: -99 '\235' -114 '\216' -23 '\351' -99 '\235'
设置intel风格汇编
sudo echo "set disassembly-flavor intel"> ~/.gdbinit
GDB 在启动的时候会按一定的路径顺序(通常是先当前目录而后用户目录)寻找 .gdbinit
文件,一旦找到,就会自动执行里面的命令。这个功能允许用户把常用的一些命令放在这个文件里,这样就不用每次进入 gdb 后再去手动执行这些命令。事实上,.gdbinit
就是一个脚本,甚至可在里面把常用的若干 gdb命令序列定义成一个新命令,这样只要在 gdb 里面输入这个新命令就等于自动执行了被定义的那个命令序列。
另外,如果用户已经在 gdb 里后,再去修改 .gdbinit
,只要通过:
(gdb) source ~/.gdbinit
便可以让那些新增加的改动生效。
或者临时生效,在gdb里
set disassembly-flavor intel
用display自动打印变量值:
https://mambainveins.gitee.io/2020/09/01/2020-09-01-gdb_display/
数组多个值:*array@10
是查看前10个。
重定向输出
set logging on
Enable logging.
set logging off
Disable logging.
set logging file file
Change the name of the current logfile. The default logfile is gdb.txt.
set logging overwrite [on|off]
By default, gdb will append to the logfile. Set overwrite if you want set logging on to overwrite the logfile instead.
set logging redirect [on|off]
By default, gdb output will go to both the terminal and the logfile. Set redirect if you want output to go only to the log file.
show logging