Kernel panic 堆栈信息怎么看

发布时间 2023-05-23 10:26:00作者: 武平宁

Kernel panic 是指 Linux 内核遇到了无法继续执行的致命错误,此时会在屏幕上输出一些错误信息,其中就包括堆栈信息。堆栈信息是指发生错误时 CPU 执行的代码路径,可以通过堆栈信息来定位错误发生的位置。

通常,堆栈信息会以类似下面的形式输出:

Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
CPU: 0 PID: 1 Comm: init Not tainted 4.4.0-31-generic #50-Ubuntu
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
 ffffffff813f7ab7 ffff8800363c7e00 ffffffff817e0c5d 0000000000000000
 ffff8800363c7e38 ffff8800363c7e20 ffffffff8108124c ffff8800363c7e58
 ffffffff810812a2 ffffffff81862f78 ffffffff81862f68 ffffffff81862f68
Call Trace:
 [<ffffffff813f7ab7>] dump_stack+0x63/0x82
 [<ffffffff817e0c5d>] panic+0xc8/0x1fe
 [<ffffffff8108124c>] do_exit+0x6d4/0x6e0
 [<ffffffff810812a2>] do_group_exit+0x42/0xa0
 [<ffffffff8108a300>] get_signal+0x2f8/0x5c0
 [<ffffffff81015eb5>] do_signal+0x55/0x6d0
 [<ffffffff8108f9cc>] ? __fget_light+0x3c/0x50
 [<ffffffff81011c2b>] do_notify_resume+0x9b/0xc0
 [<ffffffff817fba0c>] int_signal+0x12/0x17

堆栈信息的最后一行是 Call Trace:,接下来的几行是函数调用栈,每一行都是一个函数调用,最上面的是发生错误的函数,最下面的是最开始的函数。

在上面的例子中,发生错误的函数是 panic+0xc8/0x1fe,它是由函数 do_exit+0x6d4/0x6e0 调用的,而 do_exit 又是由函数 do_group_exit+0x42/0xa0 调用的,以此类推,直到最下面的 int_signal+0x12/0x17,它是被中断处理程序调用的。

通过分析堆栈信息,可以找到发生错误的函数及其调用关系,从而定位错误原因。