如何在启动时捕获整个内核的恐慌

使用Buildroot,我试图做一个自定义的内核构build。 在VirtualBox环境中构build映像并将其引导后,内核在GRUB阶段之后总是发生混乱。 我看到的一般总结:

] CPU: 0 PID: 1 ... ] Hardware name: innotek GmbH ... ] <some registers> ] Call Trace: ] [<c0a1c995>] dump_stack+... ] [<........>] panic+... ] [<........>] do_exit+... ] ... ] Kernel Offset: 0x0 from 0xc0400000 ... ] ---[ end Kernel panic - not syncing: Attempted to kill init! ... 

现在,我假设这只是我希望看到的消息的尾部,但我没有办法查看它(例如:不能Shift-PageUp)。 当恐慌发生时,上面的文本永远不会在屏幕上呈现一秒钟。

我首先偶然发现了一个KernelDebuggingTricks页面 ,其中指出:

在启动时减慢内核消息

… [内部版本]启用以下选项:

CONFIG_BOOT_PRINTK_DELAY = Y

用以下内核引导参数启动机器:

boot_delay = N

我已经确认我的内核(3.16)已经使用boot_delay选项构build,并尝试将boot_delay设置为boot_delay和1000毫秒。 即使设置了1000毫秒的延迟时间(并等待大约5分钟),整个内核恐慌日志消息也瞬间传出。

有没有人有任何build议,我可以如何查看内核恐慌的根? 我现在唯一想到的是手动添加睡眠到内核代码(这是我想避免)。

通过将console=ttyS0 console=tty0到引导参数中,配置您的虚拟机以登录到串行控制台以及控制台,然后将您的机器的串行端口(在VirtualBox设置中)配置为输出到文件。 如果发生内核恐慌,细节将以该文件结束。

有关详细信息,请参阅: https : //www.virtualbox.org/wiki/Serial_redirect

kdump和netdump是两个更多的选择,如果你没有一个串口的便利,这是在大多数现有的笔记本电脑上运行金属的情况下。 有关详细信息,请参阅以下答案: https : //unix.stackexchange.com/a/60928/32558但是,设置涉及更多。

最后,您可能还有兴趣使用JTAG或QEMU(不确定Virtualbox支持) 调试内核 : Linux内核实时调试,如何完成以及使用哪些工具?