内核异常kernel panic该如何定位?

本文深入分析了一段MIPS内核异常的日志信息,详细介绍了异常发生的位置、上下文以及如何通过编译debuginfo内核、使用gdb进行调试的方法来定位并解决问题。提供了一个从日志到代码定位的完整流程,对于内核开发和维护人员具有实用价值。

异常信息:

[   3.970213] Switched to NOHz mode on CPU #0

[   3.987118] Unhandled kernel unaligned access[#1]:

[   3.996675] Cpu 0

[   4.000556] zero[$0]=00000000   at[$1]=00000075  v0[$2]=ffffffed   v1[$3]=00000001

[   4.016275]   a0[$4]=ffffffed    a1[$5]=806c105c  a2[$6]=8077e6d0   a3[$7]=00000000

[   4.031989]   t0[$8]=806c105d    t1[$9]=00000001  t2[$10]=8075b0c0  t3[$11]=031c0084

[   4.047705]   t4[$12]=8075c1b0 t5[$13]=00000007 t6[$14]=40008100  t7[$15]=00000000

[   4.063421]   s0[$16]=ffffffed  s1[$17]=00000001  s2[$18]=88113400  s3[$19]=80759518

[   4.079137]   s4[$20]=80759520  s5[$21]=80900000  s6[$22]=00000000  s7[$23]=88113408

[   4.094853]   t8[$24]=00000000  t9[$25]=8001a484  k0[$26]=80838708  k1[$27]=80015820

[   4.110569]   gp[$28]=88030000  sp[$29]=88031d58  s8[$30]=00000000  ra[$31]=80011f78

[   4.126283] Hi    : 00000000

[   4.132107] Lo    : 00000000

[   4.137971] epc  : 802b8ee0 regulator_is_enabled+0x14/0x8c

[   4.149243]     Not tainted

[   4.154899] ra   : 80011f78usb_audio_select+0x38/0xc0

[   4.165485] Status: 10000c03    KERNEL EXL IE

[   4.174486] Cause : 00800010

[   4.180316] This is Address error exception (load or instruction fetch)

[   4.193736] BadVA : 00000019

[   4.199566] PrId  : 7ae1024f (Ingenic Xburst)

[   4.208396] Modules linked in:

[   4.214578] Process swapper (pid: 1, threadinfo=88030000, task=88028000,tls=00000000)

[   4.230646] Stack : 00000001 88113400 80759518 80759520 80900000 ffffffed00000001 80011f78

[    4.247238]         88113400 8034bbc8 00000000 0000000088114980 00000001 88114980 8034bd58

[   4.264190]         8075952880759554 807823c8 0000000000000000 8029f7dc 807823c8 80759520

[   4.281142]         8084000080759554 807823c8 0000000000000000 00000000 00000000 8029fb40

[   4.298094]         88112a80 8022cd40 88114700 8811470080759520 807823c8 8075955488114700

[   4.315046]         ...

[   4.320348] Call Trace:

[   4.325293] [<802b8ee0>]regulator_is_enabled+0x14/0x8c

[   4.335897] [<80011f78>] usb_audio_select+0x38/0xc0

[   4.345790] [<8034bd58>] dwc2_jz_probe+0x170/0x468

[   4.355501] [<8029fb40>] driver_probe_device+0xa4/0x1e0

[   4.366092] [<8029fd38>] __driver_attach+0xbc/0xc4

[   4.375802] [<8029e6d8>] bus_for_each_dev+0x4c/0xa8

[    4.385690] [<8029f3a0>]bus_add_driver+0x1d4/0x2b8

[   4.395579] [<802a04c0>] driver_register+0x90/0x1a0

[   4.405468] [<80010564>] do_one_initcall+0x164/0x1f0

[   4.415526]

[   4.418526]

[   4.418530] Code: afbf001c  afb10018 00808021 <8c84002c> 0c17a987  24840040 8e04002c  8c820000  8c42000c

[   4.441405] ---[ end trace 13b17594e01c34f1 ]---

[   4.450749] Kernel panic - not syncing: Attempted to kill init!

[   4.462707] Rebooting in 3 seconds..Restarting after 4 ms

 

确认异常位置:

异常发生的函数名及其在函数里的位置:epc   :802b8ee0 regulator_is_enabled+0x14/0x8c

异常所在函数的上一级函数名称是:ra    : 80011f78usb_audio_select+0x38/0xc0

 

如何找到该异常函数据所在的文件及位置:

1)编译含debug info的内核包,打开如下选项:

CONFIG_DEBUG_KERNEL=y

CONFIG_DEBUG_INFO=y

 

2)用gdb调试vmlinux,通过b *0x80011f78打印出异常的代码位置:

mipsel-linux-android-gdb kernel/vmlinux

(gdb) b *0x80011f78

Breakpoint 1 at 0x80011f78: filearch/mips/xburst/soc-m200/chip-m200/glass/common/audio_usb_select.c, line 90.

 

Ps:gdbandroid的交叉编译工具包里,prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin/mipsel-linux-android-gdb,我列举的是mips,如果是arm,则选arm的工具。

Linux 内核升级后出现 kernel panic 是一种常见的系统故障,通常与硬件兼容性、驱动程序问题或内核配置错误有关。以下是可能导致此问题的几个原因及相应的解决方案: ### 原因一:硬件不兼容 某些硬件设备可能在新版本的 Linux 内核中未被正确支持,尤其是较旧的或非主流硬件。例如,使用 AMD 处理器的系统可能会遇到兼容性问题,因为旧版本的内核可能无法识别新的 CPU 架构。 **解决方案:** - 回退到之前的稳定内核版本。 - 更新 BIOS 或固件以确保与最新内核的兼容性。 - 检查主板和处理器的官方文档,确认它们是否支持当前使用的内核版本。 ### 原因二:驱动程序冲突 在升级过程中,某些驱动程序可能变得不兼容或者被错误地加载,导致系统崩溃。比如,在引用内容中提到的情况,如果存在不兼容的声音芯片或其他外设驱动,也可能引发此类问题 [^1]。 **解决方案:** - 禁用或卸载有问题的驱动程序。 - 使用 `lsmod` 命令检查是否有潜在冲突的模块,并通过 `rmmod` 卸载它们。 ```bash # lsmod | grep "b43\|ssb\|bcma\|wl" # rmmod b43 # rmmod ssb # rmmod bcma # rmmod wl ``` - 将这些驱动程序加入黑名单,防止它们在未来自动加载。 ```bash # echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf # echo "blacklist bcma" >> /etc/modprobe.d/blacklist.conf # echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf ``` ### 原因三:文件系统损坏或丢失关键文件 如果根文件系统受损或缺少必要的启动文件,也会导致 kernel panic。 **解决方案:** - 使用 Live CD/USB 启动系统,尝试修复文件系统。 - 检查 `/boot` 目录下的所有必要文件是否存在且完整。 - 如果发现文件缺失,可以尝试重新安装 GRUB 引导加载程序。 ### 原因四:不当的内核编译或安装过程 手动编译并安装了一个定制化的内核时,若步骤执行不当,也容易造成系统不稳定。 **解决方案:** - 仔细审查整个编译流程,确保没有遗漏任何步骤。 - 在编译前备份原始配置文件,并严格按照官方指南进行操作。 - 考虑采用预构建的内核包来简化管理。 ### 原因五:内存不足 有时候物理内存不足以容纳新内核及其初始化所需的数据结构,尤其是在嵌入式系统上更为常见。 **解决方案:** - 增加系统的 RAM 容量。 - 减少内核配置中的功能选项,降低对内存的需求。 一旦确定了具体的问题所在,就可以采取针对性措施解决问题。此外,还可以查阅 dmesg 输出的信息以及查看系统日志(如 `/var/log/syslog` 或者 journalctl 的输出)获取更多关于 kernel panic 发生时的详细信息,这对于诊断问题非常有帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值