【问题标题】:How does one Capture the Entire Kernel Panic on Boot如何在启动时捕获整个内核恐慌
【发布时间】:2014-10-09 16:06:42
【问题描述】:

我正在尝试使用 Buildroot 进行自定义内核构建。在构建映像并在 VirtualBox 环境中启动它之后,内核总是在 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 page,它说:

启动时减慢内核消息

... [构建] 启用以下选项的内核:

CONFIG_BOOT_PRINTK_DELAY=y

并使用以下内核引导参数引导机器:

boot_delay=N

我已确认我的内核 (3.16) 已使用 CONFIG_BOOT_PRINTK_DELAY 选项构建,并已尝试在我的 GRUB 中将 boot_delay 设置为 10、500 和 1000 毫秒。即使设置了 1000 毫秒的延迟(并等待大约 5 分钟),整个内核恐慌日志消息也会在眨眼间喷出。

有人对我如何查看内核恐慌的根源有任何建议吗?我现在唯一想到的就是在内核代码中手动添加睡眠(这是我想避免的)。

【问题讨论】:

  • “上面的文字永远不会在屏幕上呈现一秒钟。” -- 嗯?你能用积极的语气和没有否定的语气来说明会发生什么吗?您是否尝试将系统控制台分配给允许记录/捕获的串行端口(又名 tty)(在内核命令行中)?
  • 尝试了你自己和duskwulf提到的串口;谢谢。
  • 任何想法,有什么问题?我也试图在 VM 环境中加载自定义内核,它的恐慌类似于你的......你如何进行的任何提示?

标签: linux debugging linux-kernel virtualbox


【解决方案1】:

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

详情见:https://www.virtualbox.org/wiki/Serial_redirect

【讨论】:

  • 谢谢!正是我想要的。使用端口模式Raw File的串口。
【解决方案2】:

kdump 和 netdump 如果您没有串行端口的便利性(大多数当前笔记本电脑在金属上运行时就是这种情况),则是另外两个选择。有关更多信息,请参阅此答案:https://unix.stackexchange.com/a/60928/32558 但是设置更复杂。

最后,您可能还对使用 JTAG 或 QEMU 逐步调试内核感兴趣(不确定 Virtualbox 是否支持):Linux kernel live debugging, how it's done and what tools are used?

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 2013-12-12
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2022-11-10
    相关资源
    最近更新 更多