Loading

linux环境使用gdb调试

安装插件

安装peda

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

偏好设置

设置汇编样式

set disassembly-flavor intel

调试控制

进入gdb

gdb executable_namegdb -q executable_name

layout src 显示源代码界面,可以实时显示代码运行到哪了!!!
如果源代码界面乱码,执行refresh即可

设置断点

b function_name,如b main
b *addr,如b *0x12345ab
b num,在第num行设置断点,行号可以通过l命令获取
b -source filename -function function_name -line line_number精确地在filename文件的function_name函数的第line_number打下断点

查看断点信息

info breakpoints

删除断点

delete num删除标号为num的断点
delete num1-num2删除标号为num1至num2的断点

clear func 删除func函数的所有断点

运行程序

r [args]
r [< inputfile]

反汇编

disas function_name

单步跳过

C模式 n
汇编模式 ni

单步进入函数

C模式 s
汇编模式 si

执行到下一个断点

c

回车自动执行上一条命令

Enter

backtrace命令

遇到程序崩溃的情况,不需要一步一步地找崩溃点。只需要在gdb中run,等程序崩溃后执行bt命令,即可检查崩溃现场。

查看和修改内存

查看某地址的字符串

x/s addr,如x/s 0x123456ab

打印从某变量开始的n个字节

p /x (char[n])*var_name,如p /x (char[10])*buff

打印数组

p *arr@n 打印一维数组
p **arr@n@m,打印二维数组

自动显示变量

display var_name 一直显示var_name的值
info display查看display信息
delete display num删除序号为num的display

watch var_name 当var_name改变时自动打印

查看某地址内存的通用方法

x /nfu addr
n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变量
i 指令地址格式
c 按字符格式显示变量
f 按浮点数格式显示变量

u表示一个地址单元的长度
b表示单字节
h表示双字节
w表示四字节
g表示八字节

如:x/2xw $rsp以四字节为单位,以十六进制的方式显示栈顶的两个单位的值

修改寄存器的值

set $eax = 0

修改某块内存的值

set {int}addr=num,如set {int}0x123456ab=4

coredump调试

archlinux的coredump默认保存在/var/lib/systemd/coredump/下,是zst格式的压缩文件。ls /var/lib/systemd/coredump -ltr可以显示coredump文件的生成时间。

  • 使用unzstd命令解压zst文件
  • gdb path/to/the/binary path/to/the/core/dump/file进入gdb并加载解压后的coredump文件
  • 进入gdb后,检查是否报错(一般为文件格式错误或文件路径错误)
  • bt命令查看栈帧
  • frame num选择标号为num的栈帧
  • list查看栈帧对应的代码(需要编译时提供-g标志)
  • info locals查看变量值
posted @ 2021-11-06 17:29  雨下yi整晚  阅读(474)  评论(0)    收藏  举报