Crash的简单学习

crash,简单,学习 · 浏览次数 : 204

小编点评

**kernel.sysrq = 1** **内核栈回溯信息** ``` bt backtrace bt pid 10 modmod 11 sym 内存地址 rd 10 [addr] [len] p 10000000 ``` **日志信息** ``` dmesg ``` **指令信息** ``` kmem -i kmem -s kmem [addr] rd -S [addr][len] p 10000000 ``` **进程信息** ``` ps ``` **文件信息** ``` files pid 10 ``` **内存信息** ``` kmem -i kmem -s kmem [addr] ``` **符号表信息** ``` sym 内存地址 ``` **内存结构** ``` rd [addr] -e [addr] ```

正文

Crash的简单学习


前言

最近进行海光服务器的压测, 多次出现了压测时宕机的情况. 
跟OS,DB还有hardware的vender都进行过沟通, 但都比较难定位具体问题. 
麒麟操作系统说需要进行一下vmcore的确认.
这边也获取了一下麒麟的文档. 想着自己总结一下问题. 便于以后查询

kdump的简介

kdump 应该是linux为了进行问题定位的一个内核转储机制.
他的方式为,在内核出现宕机或者是panic时有一个抓取内存映象的内核进程
将生产内核的核心内存dump出来. 便于宕机后的事故分析. 
默认的存储位置是
/var/crash/$date_time/vmcore

可以使用 crash的命令进行解析, 需要注意的是需要使用 debug版本的vmlinux进行相关动作.

环境准备

需要安装几个必备的软件:
yum install crash  kexec-tools -y 

开启kdump的服务
systemctl enable kdump && systemctl start kdump 

注意需要下载一个对应内核的 debug 的rpm包. 麒麟的下载地址为:
https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/updates/x86_64/debug/
注意注意 麒麟的SP1以及SP2和SP3的位置其实都不一样.
uname -a 获取内核信息进行下载就可以了. 

注意 银河麒麟的debug 的kernel的位置为:
/usr/lib/debug/usr/lib/modules/
需要说明. 如果内核升级了,需要重新下载新的debug kernel.不然无法解析. 

触发宕机

# 注意千万不要用于生产, 会直接导致宕机. 

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

# 重要事情说三遍, 不要用于生产
# 重要事情说三遍, 不要用于生产

使用命令进行分析

crash /usr/lib/debug/usr/lib/modules/xxxx/vmlinux /var/crash/xxxx/vmcore

执行 bt 命令 可以查看堆栈信息
据说bt 命令的含义是 back trace -=


13723.534444] sysrq: Trigger a crash
[13723.534461] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
[13723.534463] PGD 0 P4D 0 
[13723.534469] Oops: 0002 [#1] SMP NOPTI
[13723.534473] CPU: 91 PID: 498332 Comm: bash Kdump: loaded Not tainted 4.19.90-52.15.v2207.ky10.x86_64 #1
[13723.534475] Source Version: e17111569035580c1da88ed44f96cbdcf3390e0c
[13723.534477] Hardware name: Inspur CS5280H/CS5280H, BIOS 3.3.48 2022-10-20
[13723.534487] RIP: 0010:sysrq_handle_crash+0x12/0x20
[13723.534489] Code: 5d 41 5e 41 5f e9 fe 99 be ff 48 89 ef e8 76 fb ff ff e9 ae fe ff ff 90 0f 1f 44 00 00 c7 05 c5 2e eb 00 01 00 00 00 0f ae f8 <c6> 04 25 00 00 00 00 01 c3 0f 1f 44 00 00 0f 1f 44 00 00 53 8d 5f
[13723.534491] RSP: 0018:ffffbc5e68717e70 EFLAGS: 00010286
[13723.534493] RAX: ffffffffb4392000 RBX: 0000000000000063 RCX: 0000000000000000
[13723.534494] RDX: 0000000000000000 RSI: ffff95827fcd6968 RDI: 0000000000000063
[13723.534496] RBP: ffffffffb539bf20 R08: 00000000000009a9 R09: 0000000000000007
[13723.534497] R10: 0000000000000000 R11: ffffffffb5ccf6b2 R12: 0000000000000004
[13723.534498] R13: 0000000000000000 R14: 0000556ea72ff410 R15: 0000000000000000
[13723.534500] FS:  00001517cb5c1740(0000) GS:ffff95827fcc0000(0000) knlGS:0000000000000000
[13723.534502] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[13723.534503] CR2: 0000000000000000 CR3: 0000004080dd0000 CR4: 00000000003406e0
[13723.534504] Call Trace:
[13723.534511]  __handle_sysrq+0x78/0x130


宕机命令解析-1

sysrq 其实是一个组合键, 只要内核不会完全死掉,就会打印出来特定的信息

打开这个功能,运行:
echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
echo 0 > /proc/sys/kernel/sysrq
如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1。重新启动以后,此功能将会自动打开。
kernel.sysrq = 1


但是需要注意, 打开这个操作有一个的风险. 

宕机命令解析-2

立即重新启动计算机
echo “b” > /proc/sysrq-trigger
立即关闭计算机
echo “o” > /proc/sysrq-trigger
导出内存分配的信息 (可以用/var/log/message 查看)
echo “m” > /proc/sysrq-trigger
导出当前CPU寄存器信息和标志位的信息
echo “p” > /proc/sysrq-trigger
导出线程状态信息
echo “t” > /proc/sysrq-trigger
故意让系统崩溃
echo “c” > /proc/sysrq-trigger
立即重新挂载所有的文件系统
echo “s” > /proc/sysrq-trigger
立即重新挂载所有的文件系统为只读
echo “u” > /proc/sysrq-trigger

crash 命令学习

1. bt
backtrace打印内核栈回溯信息,bt pid 打印指定进程栈信息。
2. log
打印vmcore所在的系统内核dmesg日志信息
3. dis
dis -l (function+offset) 10 反汇编出指令所在代码,10代表打印该指定位置开始的10行信息。
4. mod
mod 查看当时内核加载的所有内核模块信息
5. sym命令
“sym 内存地址”转换指定符号为其虚拟地址,显示系统中对应的符号表信息,并且具体到源代码的那一行
6. ps命令
ps 打印内核崩溃时,正常的进程信息
7. files命令
files pid 打印指定进程所打开的文件信息
8. vm命令
vm pid 打印某指定进程当时虚拟内存基本信息
9. task命令
task 查看当前进程或指定进程task_struct和thread_info的信息
10.kmem命令
查看当时系统内存使用信息
kmem -i         //查看内存整体使用情况
kmem -s        //查看slab使用情况
kmem [addr]   //搜索地址所属的内存结构
11. rd命令
读取内存内容
rd [addr] [len]                  //查看指定地址,长度为len的内存
rd -S [addr][len]               //尝试将地址转换为对应的符号
rd [addr] -e [addr]            //查看指定内存区域内容
12. p命令
p命令可以用来打印出表达式或者变量的值

与Crash的简单学习相似的内容:

Crash的简单学习

Crash的简单学习 前言 最近进行海光服务器的压测, 多次出现了压测时宕机的情况. 跟OS,DB还有hardware的vender都进行过沟通, 但都比较难定位具体问题. 麒麟操作系统说需要进行一下vmcore的确认. 这边也获取了一下麒麟的文档. 想着自己总结一下问题. 便于以后查询 kdump

salesforce零基础学习(一百二十九)Lead Conversion 有趣的经历

本篇参考:https://help.salesforce.com/s/articleView?id=000382564&type=1 Lead Conversion 是salesforce中sales cloud的一个很好用的功能。sales cloud流程可以简单的理解成 lead to cash

[转帖]crash工具分析Kdump下vmcore文件常用命令总结(三)(实例易懂)

一、简介 本文主要介绍使用crash工具对kdump生成的vmcore文件进行分析,解析常见的crash命令,前面已讲述两章关于Kdump的内容,读者感兴趣可以点击下面的链接: 1、Kdump调试机理总结(一) 2、Kdump配置及使用详细总结(二) 系统产生异常时,触发Kdump机制,启动捕获内核

[转帖]使用 Crash 工具分析 Linux dump 文件

前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果发生了错误,就不应该继续运行。因此内核发生错误时,它的行为通常被设定为系统崩溃,机器重启。基于动态存储器的电气特性,机器重启后,上次错误发生时的现场会遭到破坏,这使得

[转帖]Kdump配置及使用(详细)总结(二)

一、简介 本文主要介绍如何打开Kdump并对其相关文件进行配置。前面章节已经对Kdump调试机理进行总结总结,具体可以点击下面链接: Kdump调试机理总结(一) crash工具分析vmcore文件常用命令总结(三) 二、Kdump整体介绍 1、kdump kdump 是一种先进的基于 kexec

[转帖]Kdump调试机理详细总结(一)

https://blog.csdn.net/luckiers/category_11796393.html 一、简介 本文主要讲解Kdump的运行机理,后续两个章节会详细介绍kdump的使用和如何分析coredump文件信息,具体链接如下: Kdump配置及使用详细总结(二) crash工具分析vm

记一次 .NET 某企业采购平台 崩溃分析

## 一:背景 ### 1. 讲故事 前段时间有个朋友找到我,说他们的程序有偶发崩溃的情况,让我帮忙看下怎么回事,针对这种 crash 的程序,用 AEDebug 的方式抓取一个便知,有了 dump 之后接下来就可以分析了。 ## 二:Windbg 分析 ### 1. 为什么会崩溃 既然是程序的崩溃

万字长文详解如何使用Swift提高代码质量

京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。

[转帖]实战案例分享:根据 JVM crash 日志定位和分析问题

https://cloud.tencent.com/developer/article/1744442 1. JVM crash了 下面是一份crash report, 下面是截取了crash report的部分,用于分析: # Problematic frame: # V [libjvm.so+0

【技术剖析】7. 看看毕昇 JDK 团队是如何解决 JVM 中 CMS 的 Crash

【技术剖析】7. 看看毕昇 JDK 团队是如何解决 JVM 中 CMS 的 Crashhttps://bbs.huaweicloud.com/forum/thread-168485-1-1.html JDK JVM 发表于 2021-11-10 16:24:554174查看 作者: 王帅 > 编者按