内核冻结:如何调试?

时间:2013-04-27 18:07:10

标签: linux-kernel kernel freeze

我有一个带有数千行内核模块的嵌入式主板,它随机时间冻结随机和复杂的用例。我尝试调试它有什么解决方案?

我已经尝试了魔法系统请求,但它不起作用。我想这个解释是我在一个循环或一个死机中禁用硬件中断的代码?

谢谢, EVA。

1 个答案:

答案 0 :(得分:9)

通常,嵌入式主板有watch dog。您应该启用此计时器并使用watchdog用户进程启动看门狗硬件。在nice进程上使用watchdog,以便更高优先级的任务必须放弃CPU。这提供了有关问题的线索。如果设备未在看门狗处于活动状态时重置,则可能只有网络串行端口已停止通信。即,内核尚未锁定。问题是没有用户可见的活动。如果/当此类问题出现在现场时,看门狗也很有用。

对于内核锁定的情况,lockup watchdogs内核功能可能很有用。如果您推测出无限循环/死锁,这将有效。但是,如果这是自定义硬件,则 SDRAM 外围设备也可能会锁定并导致总线异常活动。这将阻止CPU获取正确的代码;显然, Linux 很难从中恢复。

您可以将监视程序与用作跟踪缓冲区休眠内存组合在一起。 memmap=mem=可以限制内核使用的内存。可以编写使用此内存的驱动程序/设备,以便在重新启动后保存跟踪点。在内核启动时检测到监视程序重置时,将转储休眠内存的环形缓冲区。

如果问题可重复,或者发现如何使事件可重复,注册可以在上下文切换上执行printk的线程notifiers也很有用。确定导致锁定的事件序列后,可以使用范围逻辑分析器进行最终诊断。或者,在这一点上可能很明显哪个外围设备是问题。

您也可以在内核命令行上设置panic=-1reboot=...。如果您只有代码问题,kdump工具很有用。

相关:kernel trap (at web archive)。此链接可能不再可用,但对此答案并不重要。