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_name 或gdb -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查看变量值

浙公网安备 33010602011771号