微知SOP-定位Linux crash问题的几个常用方面和常用命令?

news2024/10/28 19:06:00

文章目录

  • 1 背景
  • 2 问题描述和SOP
      • 2.1 进入目录
      • 2.2 安装crasn和vmlinux
      • 2.3 使用crash命令进入debug目录
      • 2.4 收集主要信息
      • 2.5 收集task关键信息
      • 2.6 查看堆栈信息
      • 2.7 使用反汇编查看crash所在行
      • 2.8 根据寄存器获取一些关键数据
      • 2.9 根据堆栈获取信息
      • 2.10 加载内核模块
      • 2.11 收集其他task信息
      • 2.12 其他帮助信息
  • 3 综述

1 背景

x86或者arm上存在crash,如何快速定位?隔一段时间老是忘记。本文主要记录从头到尾在一台新服务器出现异常如何快速定位的记录。如果没有文档容易少收集信息。本文详细记录需要收集的一些关键信息,虽然不全,但是基本能定位出个大概。尤其其中的结合SP堆栈指针SP + rd + struct能够看到表面现象背后很多隐藏的数据,打开了一闪通往真相的大门,灵活运用并结合反汇编和操作系统函数调用应该算一个高阶功法了。参悟可以打出“立棍式”。`

2 问题描述和SOP

本文是一次服务器上crash的日志,进行的一些分析。

2.1 进入目录

进入/var/crash中最新的crash目录:
快速进入最近一次crash的快捷命令:

# 快速进入最近一次crash的目录
cd /var/crash/`ls /var/crash -t | head -n 1` && pwd && ls

在这里插入图片描述

2.2 安装crasn和vmlinux

# 安装vmlinux
yum install -y crash
yum install -y kernel-debuginfo*
yum install -y kernel-debuginfo-common*
# 确定安装vmlinux成功
ls /usr/lib/debug/lib/modules/`uname -r`/vmlinux -l

如果没有在对应的rpm包网站下载
实操效果:
在这里插入图片描述

2.3 使用crash命令进入debug目录

crash /usr/lib/debug/lib/modules/`uname -r`/vmlinux ./vmcore

实操效果:
在这里插入图片描述

2.4 收集主要信息

主要通过2个收集,一个是进入时候显示的信息,另一个是vmcore-message.log文件

进入后读取关键信息,包括:
panic主要信息:比如图中是访问了一个空指针:BUG: unable to handle kernel NULL pointer dereference at 0000000000000030
PID信息,比如图中2948098
PID的名字,比如图中poweroff

另外vmcore-message文件获取堆栈数据,可以通过目录下的文件显示,也可以直接在crash中显示,使用log命令,快速获取最后crash点可以:

# 显示crash关键信息
log -T | tail -n 100

根据关键信息,能够获取几个点:

  1. pid:PID: 2948098
  2. 出问题时候的CPU: CPU: 1
  3. 进程名字:Comm: poweroff
  4. 主要问题原因:NULL pointer
  5. 堆栈关键点:mlx5e_destroy_mdev_resources+0x37/0xa0 [mlx5_core]
  6. 包括堆栈的触发源头:do_syscall_64 和 kernel_power_off 可见是关机
  7. 以及各种寄存器信息,主要包括PC指针和SP指针

实操:
在这里插入图片描述

2.5 收集task关键信息

# task命令收集关键task信息,包括task状态,所在CPU。非常多的信息
 task
# 也可task命令直接指定响应的
 task 2948098

非常多的信息,比如:

  • stack = 0xffffa9a606ac4000 堆栈
  • on_cpu = 1,
  • prio = 120,
  • sched_class = 0xffffffffb4c260c0 <fair_sched_class>, 调度
  • cfs_rq = 0xffff9a9a9fa338c0, 调度队列
  • mm = 0xffff9a934e458600, 内存 mm
  • pid = 2948098,

实操:
在这里插入图片描述

2.6 查看堆栈信息

使用bt和bt -l ,其中-l可以显示代码所在行

# 查看堆栈
bt
# 查看堆栈所在代码行
bt -l

实操:
在这里插入图片描述
bt -l显示代码所在行,由于没有加载驱动所在的源文件,没有显示代码行
在这里插入图片描述

2.7 使用反汇编查看crash所在行

# 使用反汇编查看crash所在行,使用PC指针
dis -l ffffffffc03d792d

# 使用反汇编指定堆栈中某行代码汇编所在行
dis -l mlx5e_destroy_mdev_resources+0x37

# 使用反汇编指定堆栈中某行代码查看所在代码
dis -s mlx5e_destroy_mdev_resources+0x37

在这里插入图片描述
在这里插入图片描述

2.8 根据寄存器获取一些关键数据

除了dmesg打印的堆栈信息,以及register等信息,其实通过寄存器信息还能获取堆栈信息。堆栈信息里面包括了各种调用流程,以及暂存的参数信息,尤其是参数!结合rd以及struct有巨大效果
在X86上主要寄存器包括“

  • RDI 第一 第一个参数 R是register DI(“第一”)
  • RSI 第二个参数,S是second。 (“顺义”)
  • RDX 第三个参数或者第二个返回值。 (“定西”)
  • RCX 第四个参数(“慈溪”)
  • R08 第五个参数
  • R09 第六个参数
  • RAX 临时寄存器或者第一个返回值
  • RBP 栈帧寄存器 P时候pointer B是base
  • RSP 是堆栈指针

在ARM上:
X0~X8都是参数,更多需要参考arm手册。

比如这里:

[Mon Oct 14 02:09:24 CST 2024] RSP: 0018:ffffa9a606ac7cd8 EFLAGS: 00010246
[Mon Oct 14 02:09:24 CST 2024] RAX: ffff9a8ba234e000 RBX: 0000000000000000 RCX: 00000000c01809f8
[Mon Oct 14 02:09:24 CST 2024] RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff9a8ba23801a0
[Mon Oct 14 02:09:24 CST 2024] RBP: ffff9a8ba23ad308 R08: ffff9a8ba2380058 R09: c0000000ffff7fff
[Mon Oct 14 02:09:24 CST 2024] R10: 0000000000000001 R11: ffffa9a606ac7aa0 R12: ffff9a8ba23ad328
[Mon Oct 14 02:09:24 CST 2024] R13: ffffffffb4f747e1 R14: ffff9a934e741138 R15: 0000000000000000
[Mon Oct 14 02:09:24 CST 2024] FS:  00007f8313fe3980(0000) GS:ffff9a9a9fa00000(0000) knlGS:0000000000000000
[Mon Oct 14 02:09:24 CST 2024] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[Mon Oct 14 02:09:24 CST 2024] CR2: 0000000000000030 CR3: 0000000847fe8001 CR4: 00000000000606e0

其中:
RSP: RSP: 0018:ffffa9a606ac7cd8
RDI: ffff9a8ba23801a0 第一个参数
RSI: 0000000000000000 第二个参数
RDX: 0000000000000001 参数3
RCX: 00000000c01809f8 参数4

注意这里如果调用函数只有一个参数,那么RSI这种可能是上一个函数的参数,注意只是可能。
通过这些参数结合struct,能够获取宝贵的数据

比如这里就可以良好利用RSP:ffffa9a606ac7cd8,使用内存读取rsp的前后数据
读取前,需要加载对应的内核模块。

# 如果这里知道第一个参数在代码中是某个struct ,比如struct mlx5e_priv ,则显示
struct mlx5e_priv 00000000fee1dead

这里关于寄存器要定位需要结合经验连猜带蒙和实验才能获取用信息。包括下面降到的真正的堆栈信息获取信息。

2.9 根据堆栈获取信息

这里堆栈信息获取专门拿一章节讲解,因为确实是太重要了。本文仅仅记录方式,后面有机会遇到crash点再单独记录文章。
RSP: 0018:ffffa9a606ac7cd8
这里的SP是堆栈指针,堆栈是从上到下长的。也就是SP是最低的地址,网上都是堆栈历史。如果是栈顶指针,则需要做一些移动。然后结合rd命令读取内存

# rd根据堆栈指针,获取堆栈数据,注意-s可以解析一些已知的数据,第二个参数是读取内存长度。如果是内存相关的可以用-S能够把kmalloc这些自动翻译出来,所以建议打印两次,原始的 -s的或者-S的
rd ffffa9a606ac7cd8 100
rd -s ffffa9a606ac7cd8 100

因为rd
这里读取的SP不对,看起来是一个用户态虚拟地址。
在这里插入图片描述
出现类似报错后,需要快速查看其他寄存器直接用前面提到的log -T | tail -n 50,查看堆栈等信息
上面之所以报错,是使用的SP地址不对。使用正确的读取后:不加-s读取的信息比较难读取
在这里插入图片描述
实用-s查看详细信息:
在这里插入图片描述
这里重点关注mlx5e_destroy_mdev_resources周边的数据,可能找到参数,另外就是读取出来的地址有0或者1这些非0xfff等比较大的地址,就要注意,可能是突破点。

结合该函数的定义:他只有一个参数,
在这里插入图片描述
这里没看到mlx5_free_bfreg函数在rd中打印,但是dmesg里面有。说明堆栈读取的还不够。
可以往前读取一些内存,比如从ffffa9a606ac7cd8开始,变成从ffffa9a606ac7ad8开始,都是读取100个:
在这里插入图片描述
可以看到mlx5_free_bfreg函数和mlx5e_destroy_mdev_resources函数有相同的mdev参数,可能也是一个帮助。
在这里插入图片描述
可以看到这里:ffff9a8ba23801a0 这个大概率是struct mlx5_core_dev mdev的值。那么就能用struct打印出mdev数据,从而帮助查看。但是需要注意这里是mdev,那么struct的时候需要*ffff9a8ba23801a0
在这里插入图片描述
然后用struct 获取数据:(这里因为用了内核自带的mlx的代码,没有源码,如果用OFED自己编译便能打印详细的详细的数据),下次自己编译后再处理。
在这里插入图片描述
至此,结合SP + rd + struct便能窥测到出问题时候关注的几个关键点信息。
另外这里有几个特殊值技巧,相同参数技巧都对于找到对应代码帮助极大!

将ko.xz解压后加载到内存中能够读取后效果:
解压:
在这里插入图片描述
加载:
在这里插入图片描述
查看:struct mlx5_core_dev ffff9a8ba23801a0
在这里插入图片描述
这里需要进一步确认正确性,确认方式是通过其中一些关键信息。比如查看玩不信息,看是否有不合理的地方,另外就是根据打印的数据,进一步去看其他数据结构的数据。
比如下面几个可以佐证这里是对的:
在这里插入图片描述
还可以进一步查看关联struct信息,比如其中的struct device和pci_dev:
device = 0xffff9a934e7410b8, pdev = 0xffff9a934e741000
在这里插入图片描述
先看device:
在这里插入图片描述
再看pdev:基本判断现在内存读取是对的。
在这里插入图片描述

2.10 加载内核模块

# 使用modinfo获取内核模块
modinfo ib_core | head -n 2
modinfo mlx5_core | head -n 2
# 获取路径,假设这里是mlnx OFED主要包括ib_core目录的和hw目录的。core是通用,hw是不同网卡下的。使用mod -S加载指定路径下所有的ko符号,方便解析struct。不断按空格
mod -S /lib/modules/4.18.0-553.22.1.0.1.an8.x86_64/kernel/drivers/infiniband/core/
mod -S /lib/modules/4.18.0-553.22.1.0.1.an8.x86_64/kernel/drivers/infiniband/hw/

实操:一般报错不用管,但需要空格加载完否则可能失败
在这里插入图片描述

2.11 收集其他task信息

# 使用ps查看其他task信息,比如要查看一些业务进程是否在等信息以及数量
ps

实操:
在这里插入图片描述

2.12 其他帮助信息

忘记某些命令怎么操作直接help来查看

help task
help bt
help dis
help rd
help ps

比如:help task还有很多他的关键信息
在这里插入图片描述

3 综述

本文详细记录需要收集的一些关键信息,虽然不全,但是基本能定位出个大概。尤其其中的结合SP堆栈指针SP + rd + struct能够看到表面现象背后很多隐藏的数据,打开了一闪通往真相的大门,灵活运用并结合反汇编和操作系统函数调用应该算一个高阶功法了。参悟可以打出“立棍式”。

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

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

相关文章

宿舍管理新篇章:基于Spring Boot的系统开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

零基础学linux文件管理

目录 引言 基础知识 回顾C语言 fopen fclose 更改进程路径&#xff1a;chdir fwrite可以用来写入 sizeof字符串 C语言默认打开三个输入输出流 过渡到系统 系统调用&#xff1a;open “位字段”或“位掩码” open的使用 关闭文件&#xff1a;close 写入&#xff1…

【C++】继承与模板

继承 1.继承的概念 概念&#xff1a;继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称之为派生类。继承呈现了面向对象程序设计的…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

Linux学习笔记 | sudo命令的基本使用

sudo命令 sudo 命令是 Unix 和 Linux 系统中用于执行需要超级用户权限&#xff08;即 root 权限&#xff09;操作的工具。它允许系统管理员授予某些用户&#xff08;或用户组&#xff09;以 root 或其他指定用户的权限来运行特定命令&#xff0c;而无需知道 root 用户的密码。…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性&#xff0c;无法实现跨平台完全兼容&#xff0c;例如&#xff1a;微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制&#xff0c;可以针对特定的平台编译执行特定的代码&#xff0c;否则不执行。…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…

OpenAI被爆12月发布其Orion AI模型!波兰“OFF”电台解雇所有记者,启用AI“主持人”|AI日报

文章推荐 Stability AI一口气推出3款图像生成模型系列&#xff01;升级版Claude 3.5 Sonnet能像人类一样操控电脑&#xff5c;AI日报 今日热点 据报道&#xff0c;OpenAI计划于12月发布其Orion AI模型 据The Verge昨日报道&#xff0c;OpenAI计划在今年12月之前发布其下一个…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场&#xff0c;是一个SQL查询界面&#xff1a; 审计&#xff1a; 查询语句如下&#xff1a; $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…

MATLAB生态环境数据处理与分析

原文链接&#xff1a;MATLAB在生态环境数据处理与分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624407&idx4&sn39c8119bba0797e6bf5cc35eea1c6767&chksmfa8da730cdfa2e266dac5221af101230d7ded29576a34856b31f736a89dbb2e3e481a5e94e8a&to…

日常笔记记录

1、Http 1.1 概念 HTTP 是 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;的简写&#xff0c;它是 TCP/IP 协议集中的一个应用层协议&#xff0c;是客户端与服务端进行交互时必须遵循的规则。它用于定义 Web 浏览器与 Web 服务器之间交换数据的过程以及…

【Docker】在AlmaLinux 8.10系统中安装Docker-ce过程分享

随着2024年6月30日&#xff0c;官方停止了对CentOS 7的维护&#xff0c;属于CentOS 7的时代终于结束了。当然&#xff0c;对于CentOS 7的维护停止&#xff0c;大家也不用过度紧张&#xff0c;目前仍有部分Linux版本可以提供企业级的生产可用系统服务&#xff0c;比如&#xff1…

Python记录-字典

定义 Python 中的字典&#xff08;dictionary&#xff09;是一种内置的数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。字典中的每个键&#xff08;key&#xff09;都是唯一的&#xff0c;并且与一个值&#xff08;value&#xff09;相关联。键…

vue3学习(二)一款优秀的编辑器

开源项目&#xff1a; https://github.com/Leecason/element-tiptap doc需要改成document&#xff0c;改完之后依然有问题&#xff0c;应该是对vue3兼容不好&#xff0c; 所以在issue中有人回复使用 https://github.com/okijhhyu/element-tiptap-vue3 经过测试&#xff0c;确实…

shiro会话管理和加密

Shiro 会话管理和加密 会话管理 缓存 加密 会话管理 Shiro提供了完整的企业级会话管理功能&#xff0c;不依赖于底层容器&#xff08;如Tomcat&#xff09;&#xff0c;不管是J2SE还是J2EE环境都可以使用&#xff0c;提供了会话管理&#xff0c;会话事件监听&#xff0c;会话存…

【自动化测试之oracle数据库】MacOs如何安装oracle- client

操作系统为Mac OS&#xff0c;本地在pycharm上跑自动化脚本时&#xff0c;因为有操作oracle数据库的部分&#xff0c;所以需要安装oracle数据库的客户端&#xff0c;并install cx_oracle,本文主要介绍如何在macOS上完成安装&#xff0c;并在python自动化测试代码中配置&#xf…

vue3项目中引入阿里图标库

开篇 本篇的主题是在vue3项目中引入阿里图标库 步骤 注册阿里图标库账号(阿里图标)&#xff0c;并创建项目 将图标加入项目中 将需要的图标先加入购物车&#xff0c;随后加入到项目中 生成项目代码 在项目中生成项目代码&#xff0c;便于后续复制到vue项目中 ## 在vue3项目…

信息安全入门——网络安全威胁

目录 前言网络安全威胁概览悄无声息的数据泄露——被动攻击明目张胆的破坏行为——主动攻击网路世界的瘟疫——病毒总结 前言 在数字化时代&#xff0c;信息安全成为了我们每个人都不得不面对的重要议题。网络安全威胁无处不在&#xff0c;它们可能来自网络的暗角&#xff0c;…