🐧内核:异常解析[转]

type
status
date
slug
summary
tags
category
icon
password
本文转载自知乎专栏《小崔的 Linux》。

1. 什么是 crash

linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成转储文件 vmcore 和 dmesg。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。 crash 就是一个被广泛使用的内核崩溃转储文件分析工具,掌握 crash 的使用技巧,对于定位问题有着十分重要的作用。

2. crash 使用

接上文,系统安装 kdump 成功后,使用如下命令手动触发系统 panic
系统崩溃,重启后生成挂死日志
在 202001301611 目录下有 2 个文件:
dmesg.202001301611:上次启动的内核 dmesg 信息
dump.202001301611:上次崩溃的信息

3. crash 分析

dmesg 文件存储上次内核的 dmesg 信息,在系统崩溃的堆栈信息,记录在这里
以上信息对内核人员非常重要,在实际分析时,基本根据堆栈信息就可以推敲出错原因,当然这需要一些经验和内核知识,这里不再展开,有时间讲一讲。
如果仔细查看,dump 文件有 40M 大小,远远大于 dmesg 文件,里面存储着上次内核的非常丰富的内核信息,包括 cpu、内存、进程等等,方便内核人员查看到根因。因为自己电脑虚拟只开了一会,如果实际业务执行,经常每个 crash 文件有几个 G。
分析 dump 文件需要内核 vmlinux,安装对应内核的 dbgsym 包
安装完毕后 crash vmlinux dump 查看
KERNEL: 系统崩溃时运行的 kernel 文件DUMPFILE: 内核转储文件CPUS: 所在机器的 CPU 数量DATE: 系统崩溃的时间TASKS: 系统崩溃时内存中的任务数NODENAME: 崩溃的系统主机名RELEASE: 和 VERSION: 内核版本号MACHINE:CPU 架构MEMORY: 崩溃主机的物理内存PANIC: 崩溃类型,常见的崩溃类型包括:SysRq (System Request):通过魔法组合键导致的系统崩溃,通常是测试使用。通过 echo c > /proc/sysrq-trigger,就可以触发系统崩溃。oops:可以看成是内核级的 Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到 Segfault 信号,一般行为是 coredump,应用程序也可以自己截获 Segfault 信号,自行处理。如果内核自己犯了这样的错误,则会弹出 oops 信息。

4. 常用命令

(原谅家里网络慢,安装包 800 多 M 等不下去了,以下日志摘自网络,有时间自己本地执行再更新)
1)bt 命令用于查看系统崩溃前的堆栈等信息。
2)log 命令可以打印系统消息缓冲区,从而可能找到系统崩溃的线索。
3)ps 命令用于显示进程的状态,带 > 标识代表是活跃的进程。
4)dis 命令用于对给定地址的内容进行反汇编。
5)struct 命令用于查看数据结构的定义原型。
6)sys 显示系统信息
7)kmem 查看内存使用信息
8)p 查看变量
9)查看某个指令地址对应的代码行
发生了 oops,通过 log 看到了 oops 的地址
ffffffff80280fa7 处访问了空指针,那么是哪一行代码?无需对着汇编反推源码位置,直接一个命令搞定
更多敲 help。

5. 参考链接

中年码农的困境log-001-我与计算机