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目录
Kernel Panic常见原因以及解决方法的更多相关文章
- 稳定性专题 | StackOverFlowError 常见原因及解决方法
导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测.故障演练.JVM.应用容器.服务框架.流量调度.监控.诊断等多个技术领域,以更结构化的 ...
- NoSuchMethodError 常见原因及解决方法
相 关 阅 读 导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测.故障演练.JVM.应用容器.服务框架.流量调度.监控.诊断等多个技术领 ...
- .NET 3.5 安装错误的四个原因及解决方法
.net framework 3.5 安装错误的四个常见原因及解决方法,飓风软件站整理,转载请注明. 1.清除所有版本 .NET Framework 安装错误后在系统中遗留的文件: 如果您以往安装过 ...
- MySQL CPU 使用率高的原因和解决方法
用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
- [Python Debug]Kernel Crash While Running Neural Network with Keras|Jupyter Notebook运行Keras服务器宕机原因及解决方法
最近做Machine Learning作业,要在Jupyter Notebook上用Keras搭建Neural Network.结果连最简单的一层神经网络都运行不了,更奇怪的是我先用iris数据集跑了 ...
- Servlet常见错误及解决方法
常见错误及解决方法 1. 404产生的原因为Web服务器(容器)根据请求地址找不到对应资源,以下情况都会出现404的错误提示: 输入的地址有误(应用名大小写不正确,名称拼写不正确) 在web.xml文 ...
- DedeTag Engine Create File False提示的种种原因及解决方法
DedeTag Engine Create File False提示的种种原因及解决方法 第一种情况:站点.文件夹权限不足造成无法建立文件 这种情况的出现,一方面可能是Apache设置的读写权限较严格 ...
- 需要我们了解的SQL Server阻塞原因与解决方法
需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...
随机推荐
- c# 反射学习笔记
首先了解C#反射的概念,反射是一个运行库类型发现的过程.通过反射可以得到一个给定程序集所包含的所有类型的列表, 这个列表包括给定类型中定义的方法.字段.属性和事件.也可以动态的发现一组给定类支持的借口 ...
- 用 Swift 制作一个漂亮的汉堡按钮过渡动画
汉堡按钮在界面设计中已经是老生常谈了,但是当我在dribbble看到这个漂亮的过渡动画时,我决定试试用代码实现它. 这是 CreativeDash team 的原型图: 你可能已经注意到了,汉堡顶 ...
- SAP BW 通过视图创建数据源(无单位)
因业务明细表中数量没有单位,所以BW创建数据源时,需做增强 数据表: ZDB_H(抬头) ZDB_I(明细) ECC 系统中: 1.创建视图ZVDBWQ,因明细表中数量没有单位,所以创建视图时不包括数 ...
- MHA自动Failover过程解析(updated) 转
允许转载, 转载时请以超链接形式标明文章原始出处和网站信息 http://www.mysqlsystems.com/2012/03/figure-out-process-of-autofailover ...
- JAMA:Java矩阵包
原文链接:JAMA:Java矩阵包 API文档链接:线性代数Java包 JAMA jama是一个非常好用的java的线性代数软件包.适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决 ...
- JS 操作 radio input(cc问卷管理)
1.选中特定的单选按钮 function showDetail(content){ $("input[name^='radio']").removeAttr("check ...
- 解决Download interrupted: Connection to https://dl-ssl.google.com refused的问题
运行->drivers->etc->hosts 加入一行 74.125.237.1 dl-ssl.google.com ok! =================上述方法已经失效, ...
- Discuz x 默认模板文件目录说明
template/default/common模板公共文件夹,全局相关 |--block_forumtree.htm 树形论坛版块分支 js 文件 |--block_thread.htm 特殊主题的风 ...
- 小白日记41:kali渗透测试之Web渗透-SQL手工注入(三)-猜测列名、表名、库名、字段内容,数据库写入
SQL手工注入 靶机:metasploitable(低) 1.当无权读取infomation_schema库[MySQL最重要的源数据库,必须有root权限]/拒绝union.order by语句 ...
- objc_msgSend消息传递学习笔记 – 消息转发
该文是 objc_msgSend消息传递学习笔记 – 对象方法消息传递流程 的基础上继续探究源码,请先阅读上文. 消息转发机制(message forwarding) Objective-C 在调用对 ...