前言
曾经我看到Linux kernel panic,我也会很panic,感觉无从下手,但经过不断学习和摸索积累后,目前的我已经不再panic了,其实内核panic后打印的信息通常都会包含一系列关键信息,会帮助我们进一步分析诊断导致系统崩溃的根本原因。
今天就先认识一下panic信息。
以下是一个ARM64架构Linux kernel panic打印信息示例:
Kernel panic - not syncing: Fatal exception in interrupt handler
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.¾.0-rc1 #1
Hardware name: Generic AArch64 (DT)
pstate: 80000005 (Nzcv daif -PAN -UAO)
pc : 0000000000000000 lr : 0000000000000000
sp : ffff800000093e20 x29: ffff800000093e00
x28: 0000000000000000 x27: 0000000000000000
x26: 0000000000000000 x25: 0000000000000000
x24: 0000000000000000 x23: 0000000000000000
x22: 0000000000000000 x21: 0000000000000000
x20: 0000000000000000 x19: 0000000000000000
x18: 0000000000000000 x17: 0000000000000000
x16: 0000000000000000 x15: 0000000000000000
x14: 0000000000000000 x13: 0000000000000000
x12: 0000000000000000 x11: 0000000000000000
x10: 0000000000000000 x9 : 0000000000000000
x8 : 0000000000000000 x7 : 0000000000000000
x6 : 0000000000000000 x5 : 0000000000000000
x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000
x0 : 0000000000000000 Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]
---[ end trace 123456789abcdef0 ]---
Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---
针对以上示例信息说明如下:
标题与原因
Kernel panic - not syncing: Fatal exception in interrupt handler
指明发生了内核恐慌(kernel panic),原因是遇到了致命异常(Fatal exception),且该异常发生在中断处理程序中。
CPU与进程信息
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.¾.0-rc1 #1
表明出错的CPU核心是0号,引发panic的进程ID为250,进程名为irq/10000000-mmc0,表示与MMC设备相关的中断处理程序。内核版本为5.¾.0-rc1,编译构建编号为#1,并且内核未被外部代码污染(Not tainted)。
硬件信息
Hardware name: Generic AArch64 (DT)
说明运行在Generic AArch64硬件平台上,并使用设备树(Device Tree, DT)作为硬件描述方式。
pstate: 80000005 (Nzcv daif -PAN -UAO)
给出了当前处理器状态寄存器的值,反映了处理器的各种模式和标志位状态。在这个例子中,N、Z、C、V标志分别代表负数、零、进位、溢出,daif字段表示调试、中断、故障、同步异常禁止位,PAN和UAO标志分别与数据对齐异常和用户地址中止有关。
程序计数器(PC)、链接寄存器(LR)、栈指针(SP)与寄存器备份
接下来是一系列寄存器的值,包括程序计数器(PC)、链接寄存器(LR)、栈指针(SP)以及其他通用寄存器(x0-x30)。这些信息值有助于定位发生异常时的指令位置和当时的上下文环境。
Call trace
Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]
展示了从异常发生点到panic函数调用的函数调用链,包括每个函数的地址偏移和函数总长度。这会有助于追踪导致panic的具体执行路径。此外,还列出了可能与问题相关的已加载模块(Modules linked in)。
Kernel Offset & Relocation Range
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
提供内核在物理内存中的加载偏移量,以及内核可重定位范围,有助于分析理解内核映像在内存中的布局。
结束标记
---[ end trace 123456789abcdef0 ]---
Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---
重复了panic的原因和内核相关信息,作为结束标记,便于识别panic信息的完整边界。
总结
综上所述,以Linux ARM64 panic打印信息为例看,其实包含了较多的诊断信息,可以帮助我们分析崩溃原因、定位错误代码位置,并结合其他调试手段(如内核转储、日志记录等)来定位和解决问题。所以,以后看到类似这种Linux panic信息,首先自己坚决不能panic!要勇敢面对!才会get到后续的精彩知识!