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