前言
曾經(jīng)我看到Linux kernel panic,我也會很panic,感覺無從下手,但經(jīng)過不斷學習和摸索積累后,目前的我已經(jīng)不再panic了,其實內核panic后打印的信息通常都會包含一系列關鍵信息,會幫助我們進一步分析診斷導致系統(tǒng)崩潰的根本原因。
今天就先認識一下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
指明發(fā)生了內核恐慌(kernel panic),原因是遇到了致命異常(Fatal exception),且該異常發(fā)生在中斷處理程序中。
CPU與進程信息
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.?.0-rc1 #1
表明出錯的CPU核心是0號,引發(fā)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)
給出了當前處理器狀態(tài)寄存器的值,反映了處理器的各種模式和標志位狀態(tài)。在這個例子中,N、Z、C、V標志分別代表負數(shù)、零、進位、溢出,daif字段表示調試、中斷、故障、同步異常禁止位,PAN和UAO標志分別與數(shù)據(jù)對齊異常和用戶地址中止有關。
程序計數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)與寄存器備份
接下來是一系列寄存器的值,包括程序計數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)以及其他通用寄存器(x0-x30)。這些信息值有助于定位發(fā)生異常時的指令位置和當時的上下文環(huán)境。
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]
展示了從異常發(fā)生點到panic函數(shù)調用的函數(shù)調用鏈,包括每個函數(shù)的地址偏移和函數(shù)總長度。這會有助于追蹤導致panic的具體執(zhí)行路徑。此外,還列出了可能與問題相關的已加載模塊(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到后續(xù)的精彩知識!