some kernel panic reasons and solutions

2023-11-04 01:58
文章标签 kernel panic solutions reasons

本文主要是介绍some kernel panic reasons and solutions,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Kernel Panic常见原因以及解决方法

Technorati 标签:  Kernel Panic

出现原因

1. Linux在中断处理程序中,它不处于任何一个进程上下文,如果使用可能睡眠的函数,则系统调度会被破坏,导致kernel panic。因此,在中断处理程序中,是不能使用有可能导致睡眠的函数(例如信号量等)。

在中断发起的软中断中,其上下文环境有可能是中断上下文,同理,也不能调用可能导致睡眠的函数。软中断执行时,全局中断是打开的,而中断程序执行时,全局中断是禁止的。

软中断除了系统调度进入点,当软中断数量频繁时,内核中有一个专门的软中断的后台程序daemon来处理其事务。

 

2. 内核堆栈溢出,或者指针异常访问时,会出现kernel panic。

    堆栈溢出:程序循环或者多层嵌套的深度过多时,可能会导致栈溢出。参考Linux的内存模型

 

3. 除0异常、内存访问越界、缓冲区溢出等错误时,当这些事件发生在应用程序时,Linux内核的异常处理机制可以对这些由应用程序引起的情况予以处理。当应用程序出现不可恢复性错误时,Linux内核可以仅仅终止产生错误的应用程序,而不影响其他程序。

  如果上述操作发生在内核空间,就会引起kernel panic。

4. 内核陷入死锁状态,自旋锁有嵌套使用的情况。

5. 在内核线程中,存在死循环的操作。

 

解决方法

1. 全部排查内核中可能造成睡眠的函数调用地方。如果是自己写的模块,则在调用睡眠函数之前打印出特征日志,以备查验。

     在内核代码中的特定位置加入printk调试调用,直接把需要关心的信息打印到屏幕上,从而得知程序执行的路径。

2. 在可疑的地方,调用dump_stack()函数或者__backtrace(),打印当前CPU的堆栈调用函数。

3. 打开Linux内核的崩溃转储机制(kdump机制,生产vmcore文件),当系统crash时,将内存内容保存到磁盘,或者通过网络发送到故障服务器,或者直接使用内核调试器。crash工具用于调试内核崩溃转储文件。

详细测试方法:Crash工具实战-变量解析

5. 使用内核自带的 notify_chain机制。Linux内核提供“通知链”功能,并预定义了一个内核崩溃通知链。当kernel panic时,异常处理程序会沿着预定义的通知链顺序调用注册到通知链中的通知函数。

6. 在RedHat、StackOverflow、查找出现bug的历史解决方案,

7. 调试方法,采用kprobe来调试内核。Kprobe在Linux kernel debug中的应用

8. 对于一些未定义指令的错误,在出现的错误log中 ,Oops - undefined instruction: 0 [#1] PREEMPT SMP ARM,结合原始镜像的system.map文件,来定位。参考链接:Linux kernel crash analysis

9. systemtap调试工具

10. gcore工具

 

-------------------------------2014-08-08分界线------------------------------------------------

在学习Linux中,从《LInux内核设计与实现》里面,看到一本《Linux 内核精髓:精通Linux内核必会的75个绝技》,这本书是日本人高桥浩和写的,在书籍的合住作者,大岩尚宏,他编写了《Debug Hack》一书,这本是有关Linux内核调试的书籍,大喜。真是按图索骥,逐渐发现新的宝贝书籍。

 

内核调试工具介绍以及使用

    Kdb

kdb是Linux内核的补丁,提供了一种在系统运行时,对内核内存和数据结构进行检查的方法,不是源码级别的调试工具。kdb主要目标在于开发和诊断一些内核的问题。

  打开KALLSYMS:General setup-->Configure standard kernel features-->Load all symblos for debugging/ksymoops

  开启kdb服务

 

     Kprobe 

     kprobe(内核探测,kernel probe)是一个动态地收集调试和性能信息的工具,如:收集寄存器和全局数据结构等调试信息,无需对Linux内核频繁编译和启动。用户可以在任何内核代码地址进行陷阱,指定调试断点触发时的处理例程。工作机制是:用户指定一个探测点,并把用户定义的处理函数关联到该探测点,当内核执行到该探测点时,相应的关联函数被执行,然后继续执行正常的代码路径。 

 

     Kprobes 提供了一个强行进入任何内核例程并从中断处理器无干扰地收集信息的接口

    Kprobes 向运行的内核中给定地址写入断点指令,插入一个探测器。执行被探测的指令会导致断点错误。Kprobes 钩住(hook in)断点处理器并收集调试信息。Kprobes 甚至可以单步执行被探测的指令。

内核探测分为kprobe, jprobe和kretprobe(也称return probe,返回探测)三种。 

kprobe可插入内核中任何指令处; 

jprobe插入内核函数入口,方便于访问函数的参数; 

return probe用于探测指定函数的返回值。 

内核配置

CONFIG_KPROBES                  General Setup--->Kprobe 

CONFIG_MODULES                  √              

CONFIG_MODULE_UNLOAD   √ 

CONFIG_KALLSYMS_ALL                   General Setup--->Configure standard kernel configuration-->Include all symbols in kallsyms 

CONFIG_KALLSYMS                           General Setup--->Configure standard kernel configuration-->Load all symbols for debugging/ksymoops 

CONFIG_KALLSYMS_EXTRA_PASS    General setup-->Configure standard kernel features-->Load all symbols for debugging/ksymoops 

CONFIG_DEBUG_INFO                       Kernel hacking-->Kernel debugging-->Compile the kernel with debug info 

CONFIG_DEBUG_FS                           Kernel hacking-->Debug Filesystem 

让内核支持DEBUGFS,使能宏CONFIG_DEBUG_FS 

CONFIG_RELAY: General Setup -> user spacerelay support

编译通过,不过生成的镜像文件太大,要精简。 

去掉I2C和MMC卡驱动的支持, 

PPP网络支持,       Device  Drivers--->Netowork device supprot-->PPP protocol 

去掉WiFI的支持      Device  Drivers--->Netowork device supprot-->Wireless LAN protocol 

去掉WiFi支持后,编译成的内核大小为1.28M可以使用了。 

经过查阅资料得知,kprobe的使用,还需要有debugfs调试文件系统的配合,因此,需要让系统启动时,生成debugfs目录

这篇关于some kernel panic reasons and solutions的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/342430

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

[Linux Kernel Block Layer第一篇] block layer架构设计

目录 1. single queue架构 2. multi-queue架构(blk-mq)  3. 问题 随着SSD快速存储设备的发展,内核社区越发发现,存储的性能瓶颈从硬件存储设备转移到了内核block layer,主要因为当时的内核block layer是single hw queue的架构,导致cpu锁竞争问题严重,本文先提纲挈领的介绍内核block layer的架构演进,然

Kernel 中MakeFile 使用if条件编译

有时需要通过if  else来选择编译哪个驱动,单纯的obj-$(CONFIG_)就不是很方便,下面提供两种参考案例: 案例一: 来源:drivers/char/tpm/Makefileifdef CONFIG_ACPItpm-y += tpm_eventlog.o tpm_acpi.oelseifdef CONFIG_TCG_IBMVTPMtpm-y += tpm_eventlog.o

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

Linux_kernel原理08

一、温故知新         系统移植         1、uboot                 uboot主要做两件事:1、负责初始化硬件;2、负责引导操作系统的启动         2、Linux内核                 Linux内核的五大功能                 【1】进程间通信                 【2】进程管理

android kernel 的config 如何选择-QCOM

https://blog.csdn.net/weijory/article/details/73104910   如何在deconfig文件里配置某个模块是否编译 首先以CONFIG_TOUCHSCREEN_FT5X06为例,这个CONFIG_TOUCHSCREEN_FT5X06在makefile里决定了obj-$(CONFIG_TOUCHSCREEN_FT5X06) += ft5x06_ts

Linux kernel xfrm 调用流程

XFRM 架构目的 主要服务于IP Security, 俗称IPsec. 应用程序主要是strongswan结合,企业级的VPN基本基于这个构建。 xfrm函数调用流程 正常的数据报文。 sendto/sendmsg -> udp_sendmsg-> ip_make_skb()->ip_send_skb()->ip_local_out(skb) udp_rcv->__udp4_lib_rc

Linux kernel中的dts dtsi dtb dtc dtb.img dtbo.img

1、问题 kernel与hsm会设置一些gpio,但是某些gpio会在kernel与hsm侧共同设置,导致最终的设置结果失败,将kernel侧在dts文件中设置的gpio注释掉之后,发现hsm设置gpio时还是失败 2、问题原因 因为dts文件不仅仅会影响kernel镜像,还会影响dtb.img与dtbo.image,因为只烧写了hsm与kernel的镜像,没有重新烧写dtb.img与dtb