gdb使用记录

19 篇文章 0 订阅
13 篇文章 0 订阅
  • 设置断点
    • break <函数名 / 行号>
  • 查看断点
    • info breakpoints [list ...]
    • info break [list ...]
    • i b
  • 清除断点
    • clear <行号>
  • 查看当前执行及之后20行代码
    • display /20i $pc
  • 使用gdb的TUI模式,调出汇编指令窗口配合调试。
    • layout asm
  • finish 运行到当前函数结束再返回;return直接返回
  • until + 行号,可以用来跳过循环

查看

info regi 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值