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
查看变量值
作者:yuxiayizhengwan
出处:https://www.cnblogs.com/yuxiayizhengwan/p/15517787.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库