我有一个带有数千行内核模块的嵌入式主板,它随机时间冻结随机和复杂的用例。我尝试调试它有什么解决方案?
我已经尝试了魔法系统请求,但它不起作用。我想这个解释是我在一个循环或一个死机中禁用硬件中断的代码?
谢谢, EVA。
答案 0 :(得分:9)
通常,嵌入式主板有watch dog。您应该启用此计时器并使用watchdog
用户进程启动看门狗硬件。在nice
进程上使用watchdog
,以便更高优先级的任务必须放弃CPU。这提供了有关问题的线索。如果设备未在看门狗处于活动状态时重置,则可能只有网络或串行端口已停止通信。即,内核尚未锁定。问题是没有用户可见的活动。如果/当此类问题出现在现场时,看门狗也很有用。
对于内核锁定的情况,lockup watchdogs内核功能可能很有用。如果您推测出无限循环/死锁,这将有效。但是,如果这是自定义硬件,则 SDRAM 或外围设备也可能会锁定并导致总线异常活动。这将阻止CPU获取正确的代码;显然, Linux 很难从中恢复。
您可以将监视程序与用作跟踪缓冲区的休眠内存组合在一起。 memmap=
和mem=
可以限制内核使用的内存。可以编写使用此内存的驱动程序/设备,以便在重新启动后保存跟踪点。在内核启动时检测到监视程序重置时,将转储休眠内存的环形缓冲区。
如果问题可重复,或者发现如何使事件可重复,注册可以在上下文切换上执行printk
的线程notifiers也很有用。确定导致锁定的事件序列后,可以使用范围或逻辑分析器进行最终诊断。或者,在这一点上可能很明显哪个外围设备是问题。
您也可以在内核命令行上设置panic=-1
和reboot=...
。如果您只有代码问题,kdump工具很有用。
相关:kernel trap (at web archive)。此链接可能不再可用,但对此答案并不重要。