前言
曾經(jīng)我看到Linux kernel panic,我也會(huì)很panic,感覺無從下手,但經(jīng)過不斷學(xué)習(xí)和摸索積累后,目前的我已經(jīng)不再panic了,其實(shí)內(nèi)核panic后打印的信息通常都會(huì)包含一系列關(guān)鍵信息,會(huì)幫助我們進(jìn)一步分析診斷導(dǎo)致系統(tǒng)崩潰的根本原因。
今天就先認(rèn)識(shí)一下panic信息。
以下是一個(gè)ARM64架構(gòu)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 ]---
針對(duì)以上示例信息說明如下:
標(biāo)題與原因
Kernel panic - not syncing: Fatal exception in interrupt handler
指明發(fā)生了內(nèi)核恐慌(kernel panic),原因是遇到了致命異常(Fatal exception),且該異常發(fā)生在中斷處理程序中。
CPU與進(jìn)程信息
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.?.0-rc1 #1
表明出錯(cuò)的CPU核心是0號(hào),引發(fā)panic的進(jìn)程ID為250,進(jìn)程名為irq/10000000-mmc0,表示與MMC設(shè)備相關(guān)的中斷處理程序。內(nèi)核版本為5.?.0-rc1,編譯構(gòu)建編號(hào)為#1,并且內(nèi)核未被外部代碼污染(Not tainted)。
硬件信息
Hardware name: Generic AArch64 (DT)
說明運(yùn)行在Generic AArch64硬件平臺(tái)上,并使用設(shè)備樹(Device Tree, DT)作為硬件描述方式。
pstate: 80000005 (Nzcv daif -PAN -UAO)
給出了當(dāng)前處理器狀態(tài)寄存器的值,反映了處理器的各種模式和標(biāo)志位狀態(tài)。在這個(gè)例子中,N、Z、C、V標(biāo)志分別代表負(fù)數(shù)、零、進(jìn)位、溢出,daif字段表示調(diào)試、中斷、故障、同步異常禁止位,PAN和UAO標(biāo)志分別與數(shù)據(jù)對(duì)齊異常和用戶地址中止有關(guān)。
程序計(jì)數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)與寄存器備份
接下來是一系列寄存器的值,包括程序計(jì)數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)以及其他通用寄存器(x0-x30)。這些信息值有助于定位發(fā)生異常時(shí)的指令位置和當(dāng)時(shí)的上下文環(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ā)生點(diǎn)到panic函數(shù)調(diào)用的函數(shù)調(diào)用鏈,包括每個(gè)函數(shù)的地址偏移和函數(shù)總長(zhǎng)度。這會(huì)有助于追蹤導(dǎo)致panic的具體執(zhí)行路徑。此外,還列出了可能與問題相關(guān)的已加載模塊(Modules linked in)。
Kernel Offset & Relocation Range
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
提供內(nèi)核在物理內(nèi)存中的加載偏移量,以及內(nèi)核可重定位范圍,有助于分析理解內(nèi)核映像在內(nèi)存中的布局。
結(jié)束標(biāo)記
---[ 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 ]---
重復(fù)了panic的原因和內(nèi)核相關(guān)信息,作為結(jié)束標(biāo)記,便于識(shí)別panic信息的完整邊界。
總結(jié)
綜上所述,以Linux ARM64 panic打印信息為例看,其實(shí)包含了較多的診斷信息,可以幫助我們分析崩潰原因、定位錯(cuò)誤代碼位置,并結(jié)合其他調(diào)試手段(如內(nèi)核轉(zhuǎn)儲(chǔ)、日志記錄等)來定位和解決問題。所以,以后看到類似這種Linux panic信息,首先自己堅(jiān)決不能panic!要勇敢面對(duì)!才會(huì)get到后續(xù)的精彩知識(shí)!