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

作者:yuxiayizhengwan

出处:https://www.cnblogs.com/yuxiayizhengwan/p/15517787.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   雨下yi整晚  阅读(388)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示