在kernel中,有一个函数可以用来产生panic,就是panic()
函数。
本文主要讲述如何模拟产生panic以及输出堆栈信息。
模拟kernel panic
以下两种方法可以产生kernel panic。
- 方法1:使用
panic()
函数:
1 |
|
- 方法2:使用
sysrq-trigger
来出发panic1
设定发生kernel panic后重启
当加载上述ko的时候,没有什么log输出,也不会重启。可以通过设定/proc/sys/kernel/panic
的值为x
,当产生panic后,经过x
秒会重启。
关于这些文件的详细解释,可以参照:<Kernel_Dir>Documentation/sysctl/kernel.txt
产生backstrace
有时候发生panic,并没有堆栈信息输出,是由于kernel没有打开debug开关。
如果想要输出堆栈信息,必须打开CONFIG_DEBUG_BUGVERBOSE
,如何打开这个宏,参照它的依赖关系:<Kernel_Dir>lib/Kconfig.debug
1 | config DEBUG_BUGVERBOSE |
必须设置CONFIG_BUG=y
。当设置CONFIG_DEBUG_BUGVERBOSE=y
之后,发生panic,打印出来的backtrace如下:
1 | [ 19.352682] in panic_test_init, line = 11 starttttt |
这样看不出啥具体的内容,发现之所以这样打印,是因为没有设置CONFIG_KALLSYMS=y
。参照如下:
1 | //<Kernel_Dir>/arch/arm/kernel/traps.c |
关于这部分的信息,可以参照:http://tinylab.org/find-out-the-code-line-of-kernel-panic-address/