Crash 实例

1.spinlock原理

为了解决这个spinlock的不公平问题,linux 2.6.25内核以后,spinlock采用了一种"FIFO ticket-based"算法的spinlock机制,可以很好的实现先来先抢占的思想。具体的做法如下:

(1)、spinlock的核心字段有owner和next,在初始时,owner=next=0
(2)、当第一个进程抢占spinlock时,会在进程函数本地保存下next的值,也就是next=0,并将spinlock的next字段加1;
(3)、当获取spinlock的进程的本地next和spinlock的owner相等时,该进程就获取到spinlock;
(4)、由于第一个进程本地的next=0,并且spinlock的owner为0,所以第一个CPU获取到spinlock;
(5)、接着当第二个进程抢占spinlock,此时spinlock的next值为1,保存到本地,然后将spinlock的next字段加1。而spinlock的owner字段依然为0,第二个进程的本地next 不等于spinlock的owner,所以一直自旋等待spinlock;
(6)、第三个进程抢占spinlock,得到本地next值为2,然后将spinlock的next字段加1。此时spinlock的owner字段还是为0,所以第三个进程自旋等待。
(7)、当第一个进程处理完临界区以后,就释放spinlock,执行的操作是将spinlock的owner字段加1;
(8)、由于第二个进程和第三个进程都还在等待spinlock,他们会不停第获取spinlock的owner字段,并和自己本地的next值进行比较。当第二个进程发现自己的next值和spinlock的owner字段相等时(此时next == owner == 2),第二个进程就获取到spinlock。第三个进程的本地next值是3,和spinlock的owner字段不相等,所以继续等待;
(9)、只有在第二个进程释放了spinlock,就会将spinlock的owner字段加1,第三个进程才有机会获取spinlock。

crash
whatis因为mm_struct的mmap_sem成员的offset就是104(0x68),
用whatis命令可以查看结构体的声明,如
whatis -o mm_struct
machcrash> mach | grep SIZE
        MEMORY SIZE: 1 GB
          PAGE SIZE: 4096
  KERNEL STACK SIZE: 16384
     IRQ STACK SIZE: 16384
OVERFLOW STACK SIZE: 4096
task -R stackPID: 128      TASK: ffff0000034f9b80  CPU: 1    COMMAND: "insmod"
  stack = 0xffff800012b20000,
setset 128 进程128 上下文
bt -sS 0x11给一个错误地址,会打印出进程128的实际栈地址
bt -T将内核栈的内容都打印出来
bt -f/-p(-p) 只打印panic的内核栈,-f 列出堆栈中的所有数据
bt -lf(-l)显示每层栈的源码和所在的行数
rd打印指针范围的栈内容 rd ffffff8990 -e fffff9ffff > mm.txt
task <pid>打印进程的task_struct 内容
dis <sym|addr>参数可以使地址、符号(函数名、变量名),对其反汇编得到该地址

对应的汇编源码
mod -s <module>加载指定安装模块的符号调试信息
mod -d xxxmodule删除指定模块的符号表和调试信息
例如 insmod modules_list.ko后,dis 模块中的函数,发现没有反汇编
出源码
要先加载符号表 mod -s module_list.ko,后 dis <function>
vm [pid] 进程虚拟地址空间
help -m查看每个cpu的中断栈
irq_stack_size: 16384
         irq_stacks[0]: ffff800010000000
         irq_stacks[1]: ffff800010008000
         irq_stacks[2]: ffff800012688000
         irq_stacks[3]: ffff800012690000
普通的全局变量普通的全局变量的值很好查看,直接p后面接函数名即可  >p jiffies_64
percup全局变量>struct rq.clock,nr_running,cfs.h_nr_running runqueues:0,2,6  冒号后指定
CPU
局部变量ATPCS规则可知:函数调用时传递的参数,当参数数量小于等于8个时,
使用x0~x7传递,大于8个时,多余的参数使用栈传递;
函数返回时返回值保存在x0中
下面命令对父函数cpu_stopper_thread函数进行反汇编,
其中"/s"参数表示显示汇编在C文件中的行数
disassemble /s cpu_stopper_thread
哪些线程正在访问/访问过
指定的变量/内存/锁
哪些线程正在访问/访问过指定的变量

再介绍最后一个实用技巧,有时候我们在分析dump的时候经常会有这样的需求:

已经知道某一把锁在内存中的地址,我们想知道有哪些线程在等这把锁;

已经知道某个全局变量的地址或名称,我们想知道有哪些任务正在访问这个全局变量;

已经知道某个函数名称,我们想知道有哪些任务的调用栈中会调用到这个函数;

这时候我们就可以使用下面命令格式,来对系统中所有的任务的调用栈进行搜索了,其中-t是对所有的任务进行搜索,不区分任务的状态。而-T则表示只对系统中正在running的任务的调用栈进行搜索

search -t/T <变量名|变量地址|函数名|函数地址|内存地址>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用&#xff0c;然后介绍其内存结构。最后&#xff0c;补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

[项目设计] 从零实现的高并发内存池(一)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 前言 项目介绍 1.内存池 1.1 什么是内存池 池化技术 内存池 1.2 为什…

word使用bib添加参考文献

文章目录 安装TexLive安装bibtex4word使用在word中添加参考文献使用bibtex4word在word中添加参考文献设置参考文献格式为毕业论文格式 参考 安装TexLive 从下载地址下载镜像iso文件texlive2023.iso双击打开iso镜像文件运行 install-tl-windows.bat点击安装非常非常非常耐心地安…

Shell学习 - 2.20 Shell exit命令:退出当前进程

exit 是一个 Shell 内置命令&#xff0c;用来退出当前 Shell 进程&#xff0c;并返回一个退出状态&#xff1b;使用$?可以接收这个退出状态&#xff0c;这一点已在《Shell $?》中进行了讲解。 exit 命令可以接受一个整数值作为参数&#xff0c;代表退出状态。如果不指定&…

Linux命令-clock命令(用于调整 RTC 时间)

说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间&#xff0c;执行这项指令可以显示现在时刻&#xff0c;调整硬件时钟的时间&#xff0c;将系统时间设成与硬件时钟之时间一致&#xff0c;或是把系统时间回存到硬件时钟。 语法 clock [--adjust][--debug][--dir…

客户端/服务器协议是啥意思?

客户端/服务器协议是指在网络通信中&#xff0c;客户端和服务器之间进行数据传输时所使用的规定。简单来说&#xff0c;客户端是用户使用的设备&#xff0c;如电脑或手机&#xff0c;而服务器则是提供数据或服务的远程计算机。当客户端需要获取数据或服务时&#xff0c;它会向服…

【RT-DETR有效改进】结合SOTA思想利用双主干网络改进RT-DETR(全网独家创新,重磅更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进RT-DETR&#xff08;本专栏目前发布以来改进最大的内容&#xff0c;同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供&#xff0c;本文内…

【活动】金三银四,前端工程师如何把握求职黄金期

随着春意盎然的气息弥漫大地&#xff0c;程序员群体中也迎来了一年一度的“金三银四”求职热潮。这个时间段对于广大前端工程师而言&#xff0c;不仅象征着生机勃发的新起点&#xff0c;更是他们职业生涯中至关重要的转折点。众多知名公司在这一时期大规模开启招聘通道&#xf…

ChatGPT 4.0使用之论文阅读

文章目录 阅读环境准备打开AskYourPDF进入主站 粗读论文直接通过右侧边框进行提问选中文章内容翻译或概括插图的理解 总结 拥有了GPT4.0之后&#xff0c;最重要的就是学会如何充分发挥它的强大功能&#xff0c;不然一个月20美元的费用花费的可太心疼了&#xff08;家境贫寒&…

WP外贸营销型网站模板

WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建wordpress企业官网使用。 零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jia…

RocketMQ—消费者的两种消费模式

RocketMQ—消费者的两种消费模式 RocketMQ消息消费的模式分为两种&#xff1a;负载均衡模式和广播模式&#xff0c;负载均衡模式表示多个消费者交替消费同一个主题里面的消息&#xff1b;广播模式表示每个每个消费者都消费一遍订阅的主题的消息。 负载均衡模式 CLUSTERING 集…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点&#xff0c;上图 列表共5条数据&#xff0c;准备输入Author过滤条件进行查询 进入查看详情页&#xff0c;就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能&#xff0c;后来放弃了&#xff0c;想到直接用路由去做可能也不错。有时间再整一套…

一篇文章了解和使用Map和Set(HashMap/TreeMap/HashSet/TreeSet)

[本节目标] *掌握HashMap/TreeMap/HashSet/TreeSet的使用 *掌握了解HashSet和HashSet背后的哈希原理和简单的实现 1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

【一起学习Arcade】(2):Geometry函数

第二篇记录下Geometry函数&#xff0c;相对于其它语言&#xff0c;Arcade对Geometry的支持是一大亮点&#xff0c;这使得它的上限被大大提高了。 三、Geometry函数 1、Angle【角度】 单位为度&#xff08;0-360&#xff09;&#xff0c;正北为90度&#xff0c;只考虑x-y平面。…

07OpenCV 图像模糊

文章目录 图像掩膜操作模糊原理均值滤波高斯滤波中值滤波双边滤波算子代码 图像掩膜操作 图像掩膜操作 模糊原理 Smooth/Blur是图像处理中最简单和常用的操作之一 使用操作的原因之一就是为了给图像预处理时候减低噪声 图像噪声是指存在于图像数据中的不必要的或多余的干扰信…

RK3568开发笔记-qt程序运行报错Failed to move cursor on screen

目录 前言 一、qt程序运行报错 二、异常解决 总结 前言 最近在进行 RK3568 平台上的 Qt 程序开发时&

使用 Docker 部署 MrDoc 在线文档管理系统

1&#xff09;MrDoc 介绍 MrDoc 简介 MrDoc 觅思文档&#xff1a;https://mrdoc.pro/ MrDoc 使用手册&#xff1a;https://doc.mrdoc.pro/p/user-guide/ MrDoc 可以创建各类私有化部署的文档应用。你可以使用它进行知识管理、构建团队文库、制作产品手册以及在线教程等。 Mr…

在Java中如何使用Lambda表达式进行函数式编程

在Java中如何使用Lambda表达式进行函数式编程 在Java中&#xff0c;使用Lambda表达式进行函数式编程主要涉及以下几个步骤&#xff1a; 理解函数式接口&#xff1a; 函数式接口是一个只有一个抽象方法的接口。Java 8引入了FunctionalInterface注解&#xff0c;用于标记这样的接…

linux安全--DNS欺骗,钓鱼网站搭建

目录 一&#xff0c;实验准备 首先让client能上网 1&#xff09;实现全网互通&#xff0c;实现全网互通过程请看 2&#xff09;SNAT源地址转换 3&#xff09;部署DHCP服务 4)配置DHCP服务 5&#xff09;启动服务 6&#xff09;安装DNS服务 7&#xff09;DNS配置 8)启动DNS…

【Python笔记-设计模式】策略模式

一、说明 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互相替换。 (一) 解决问题 在需要根据不同情况选择不同算法或策略&#xff0c;规避不断开发新需求后&#xff0c;代码变得非常臃肿难以维护管理。…