gdb上手简述

embedded/2024/9/25 8:22:11/

文章目录

  • 1. gdb通用命令
    • 1.1 常用命令
    • 1.2 查看内存
    • 1.3 屏蔽信号
  • 2. gdb跟踪调试
    • 2.1 debug版本
    • 2.2 gdb多线程调试
  • 3. gdb内存监控
    • 3.1 watch
    • 3.2 mprotect内存保护
    • 3.3 perf_event数据断点API进行内存保护
  • 4. 调试技巧
    • 4.1 gdb不阻塞进程运行
    • 4.2 查看传参、返回值

1. gdb通用命令

1.1 常用命令

命令功能
break 文件名:行号
break symbol
断点命令
delete [断点对应许序号]删除断点
backtrace (缩写t)查看调用站
info local查看所有的局部变量
thread apply all bt查看所有线程堆栈命令
p <变量名>查看局部变量
p <变量名> = xx修改变量
thread <thread_number>转到线程
frame <frame_number>转到帧
next执行下一条,不会进入子函数
step进入子函数
continue继续执行直到下一个断点命令
finish结束子函数返回到调用函数命令
until结束循环命令

1.2 查看内存

格式:x/nfu 0xxxxxxx

  • x是examine的缩写,意思是检查
  • n表示要显示的内存单元的个数
  • f表示显示方式
  • u表示一个地址单元的长度
# f的取值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。# u的取值
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节

watch内存: 触发一次之后需要重新watch才可以继续监视

命令功能
watch exprgdb在expr被程序及其值改变时停止
rwatch exprgdb在expr被程序读取时停止
awatch exprgdb在expr被程序读和写的时候停止

查看寄存器:info reg

1.3 屏蔽信号

  • signals: 进程会产生某些信号打断gdb,需要屏蔽他们的影响

一般应用软件会自行一些信号,需要使用gdb屏蔽掉

# 查看gdb信号种类以及相应处理
info signals# 改变GDB对signal信号的处理
handle signal <options>
## 操作方式如下
stop/nostop
print/noprint
pass/nopass

2. gdb跟踪调试

2.1 debug版本

  • 使用带有-g编译选项

  • release版本中往往没有调试信息,需要汇编基础

    • 使用objdump -dr xxx.o方式,查看重定位项,你可以看到函数调用关系

    • 查看寻址偏移,可以帮助我们查看操作是否为结构体成员变量

      • 比如常量、地址偏移一般就是给结构体成员变量赋值
    • 注意:编码的时候尽量简洁,可以提升定位效率

2.2 gdb多线程调试

gdb多线程命令:

gdb命令功能
info thread显示所有thread线程
thread thread_numgdb现场切换到对应的线程
thread apply id1 id2 command让一个或者多个线程执行gdb命令command
thread apply all command让所有被调用线程执行gdb命令的command
b symbol thread thread_num只给thread_num这个现成的xxx函数打断点
set scheduler-locking off|on|stepoff: 不锁定任何线程,也就是所有线程都执行,这是默认值
on: 只有当前被调试程序汇之星
step: 当用step命令调试线程时,其他线程不会执行,但是用其他命令,比如next调试线程时,其他线程也许会执行
thread apply all bt查看所有线程调用栈

gdb调试小技巧:

  • 场景一:只想获取指定任务的调用栈

    # 1. 获取任务对应的tid
    find /proc/pic/task/ -name "sched" | xargs grep threads# 2. 使用gdb -batch -ex "bt" -p pid 获取对应线程调用栈
    
  • 场景二:打印所有任务调用栈(thread apply all bt不好用的情况下)

    define allbt
    set $begin=1
    set $end=xxx
    while $begin <= $end
    thread $begin
    bt
    set $begin=$begin + 1
    end
    end
    

3. gdb内存监控

只能监控已经指导某块内存会出问题,然后复现监控

3.1 watch

  • 优点:gdb原生功能,直接能使用

  • 使用方法:见1.2

3.2 mprotect内存保护

  • 系统库

  • 使用场景:申请一块大内存(大于4k), 该内存数据不修改或者很少修改

3.3 perf_event数据断点API进行内存保护

  • 是内核对用户态提供软硬件性能数据的一个统一接口,用户通过perf_event的句柄操作能获取到各式各样的性能数据

  • 用户态接口:int perf_event_open(struct perf_event_attr attr, pid_t pid, int group_fd, unsigned long flags)

4. 调试技巧

4.1 gdb不阻塞进程运行

一般的业务进程都会有心跳机制,两种处理办法:

  • 方案一:关闭心跳机制
  • 方案二:提前写好脚本,gdb执行之后快速退出
# 直接命令行快速退出
gdb -batch -ex "call test_show()" -p pid# 使用脚本方式
gdb att pid
handle SIGXXX nostop noprint  ---屏蔽信号
set height 0   ---打印全部信息
def oops ---自定义操作,断点之后的操作
bt       ---打印调用栈
...

4.2 查看传参、返回值

ARM64:一般使用X0~X7 8个寄存器用来传参;X0一般作为返回值

# 查看传参
b sym
c
# hit断点之后,查看寄存器,一般X0~X7对应传参
info reg# 查看返回值
## 命中断点之后
finish
## 查看寄存器,关注X0
info reg

http://www.ppmy.cn/embedded/92698.html

相关文章

【Android面试八股文】荣耀面试算法题:输出所有的水仙花数

文章目录 一、水仙花数的定义二、算法实现 一、水仙花数的定义 要输出所有的水仙花数&#xff0c;我们需要先了解什么是水仙花数。 水仙花数&#xff08;Narcissistic number&#xff09;&#xff0c;也称为自恋数、自幂数、阿姆斯特朗数&#xff0c;是指一个 n 位的正整数&a…

Qt中SQLite数据库的使用

一、安装SQLite 在Qt6中&#xff0c;不再支持 SQLite2&#xff0c;只支持 SQLite3 。因此&#xff0c;有两种方式使用 SQLite&#xff0c;一种是在 SQLite 官网安装 SQLite3&#xff0c;另外一种是直接安装 SQLite Expert。 SQLite Expert 内置了 SQLite。这意味着用户在安装 S…

未来已来:人工智能如何重塑Facebook的用户体验?

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正成为推动技术进步和用户体验优化的核心力量。Facebook&#xff08;现Meta Platforms&#xff09;作为全球领先的社交媒体平台&#xff0c;正在充分利用人工智能技术&#xff0c;以重塑用户体验&#xff0…

【C语言】预处理详解(下)

文章目录 前言6. 宏和函数的对比7. #和##7.1 #运算符7.2 ##运算符&#xff08;运用较少&#xff0c;了解即可&#xff09; 8. 命名的约定9. #undef &#xff08;了解即可&#xff09;10. 条件编译&#xff08;重点&#xff09;11. 头文件的包含11.1 头文件被包含的方式&#xf…

【nginx】解决k8s中部署nginx转发不会自动更新域名解析启动失败的问题

文章目录 1. 问题2.解决办法3.扩展说明3.1 DNS解析阶段划分3.2 问题说明3.2.1 先看/etc/resolv.conf说明3.2.2 针对第一个问题3.2.3 针对第二个问题 【后端】NginxluaOpenResty高性能实践 参考&#xff1a; https://blog.csdn.net/u010837612/article/details/123275026 1. 问…

SpringBoot自动装配原理

SpringBoot自动装配原理 SpringBootApplication 中包含了三个核心注解 SpringBootConfiguration 声明当前的类是配置类 ComponentScan 组件扫描,默认扫描引导类所在包以及子包 EnableAutoConfiguration 实现SpringBoot自动化配置的核心注解 EnableAutoConfiguration …

24.8.5数据结构|栈

栈-弹夹 1、定义&#xff1a; 栈就是特殊的线性表&#xff0c;与之前的线性表的区别就是增加了约束&#xff0c;只允许在一端插入和删除&#xff0c;就这麽简单。 2、基本操作 栈的插入操作叫&#xff1a;入栈{进栈、压栈}&#xff1b;栈的删除&#xff1a;出栈{退栈&#x…

BitNet——用单个比特进行推理的大语言模型,性能媲美全精度Transformer

概述 为了实现高精确度&#xff0c;大规模语言模型变得越来越大&#xff0c;但随着模型越来越大&#xff0c;其部署也面临挑战&#xff0c;人们担心计算量和能耗会增加。本研究提出了权重为 1 的单比特变换器&#xff0c;结果表明它能以更少的计算资源和更高的能效实现与传统 …