最简单的调试方法就是用printk()印出你想知道的信息了,而前面章节讲到oops/panic时,它们就通过printk()将寄存器信息/堆栈信息打印到kernel log buffer里。 可以看到kernel log可以通过串口输出,也可以在发生oops/panic后将buffer保存成文件打包到db里,然后拿到串口log或db对kernel进行调试分析了。 通常手机会保留串口测...
Oops英文单词的中文含义是“哎呀”,表示“惊叹”;Panic英文单词的中文含义是“惊慌”。所以panic的程度显然是高于oops的,因为惊叹不一定会惊慌,而惊慌最容易失措,内核panic后,就死机了,俗称内核崩溃。但是内核报oops,这个时候不见得会panic,它可能只是报个oops,杀死进程而已。 下面我们用一个真实的例子来说明,我们在g...
一、kernel panic 二、mips异常机制 三、linuxkernel 对mips异常的处理 四、kernel panic 实例分析 Kernel panic 内核代码,相比用户层代码更难以调试,在内核程序开发上更要加倍小心和注意:有的BUG在内核或内核模块运行时会导致系统崩溃。当崩溃发生时,收集尽可能多的信息将有助于问题的解决。这就是内核OOPS诞生的目的。
(1)硬件能检测到的错误,如非法内存访问,非法指令等,此时cpu会触发异常,并进入异常处理流程。在异常处理流程中会触发oops或panic (2)内核代码进入某些代码无法处理的异常分支,此时程序若继续执行可能会导致无法预知的后果,此时相关的代码会主动进入oops或panic ...
调用BUG()会向CPU下发一条未定义指令而触发ARM发起未定义指令异常,随后进入kernel异常处理流程历经 Oops,die(),__die()等流程输出用于调试分析的关键线索,最后进入panic()结束自己再获得重生的过程,这个就是整个过程的基本流程,下面先来看die()具体做了什么呢?
"Oops"是”Out of Print Statement“的缩写,也被称为kernel panic。它是Linux内核在执行期间遇到问题时发出的一种错误消息。 当内核遇到无法处理的异常情况时,它会停止执行并输出Oops消息,以帮助开发人员诊断和解决问题。 在Linux系统中,Oops通常由硬件故障、驱动程序错误、内存管理问题或其他异常情况引起。
kernel有以下2种(oops、panic)崩溃类别 1.oops (类似assert,有机会恢复) oops是美国人比较常有的口语。就是有点意外,吃惊,或突然的意思。内核行为表现为通知感兴趣模块,打印各种信息,如寄存器值,堆栈信息… 当出现oops时,我们就可以根据寄存器等信息调试并解决问题。
可以看到kernel log可以通过串口输出,也可以在发生oops/panic后将buffer保存成文件打包到db里,然后拿到串口log或db对kernel进行调试分析了。 通常手机会保留串口测试点,但要抓串口log一般都要拆机,比较麻烦。前面讲到可以将kernel log保存成文件打包在db里,db是什么东西?
在这种情况下, 驱动本身会崩溃, 但是还不至于让系统出现致命性失败, 因为它没有锁定中断处理例程. 导致 hard panic的原因同样对soft panic也有用(比如在运行时访问一个空指针). 1 驱动OOPS实例分析 1.1 导致 OOPS 的代码 模块代码, 有一处 NULL 指针异常 ...