【问题标题】:Kernel freeze : How to debug it?内核冻结:如何调试它?
【发布时间】:2016-01-29 23:32:56
【问题描述】:

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

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

谢谢, 伊娃。

【问题讨论】:

    标签: linux-kernel kernel freeze


    【解决方案1】:

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

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

    您可以将看门狗与一些用作跟踪缓冲区空闲内存结合起来。 memmap=mem= 可以限制内核使用的内存。可以编写使用此内存的驱动程序/设备,以保存在重新启动后仍然存在的跟踪点。当在内核启动时检测到看门狗重置时,闲置内存的环形缓冲区被转储。

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

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

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

    【讨论】:

    • 您好,谢谢您的回答。我知道我的电路板处理硬件看门狗功能。我会尝试这个来确认这是一个锁定案例。我还尝试通过在内核参数中添加 slub_debug=FZPU 来使用 SLUB/SLAB 调试。然后当我运行slabinfo -v 来验证我所有的slab 时,没有输出。所以我猜想slab debug没有检测到kobject内存中的错误。我也尝试在内核配置中启用:CONFIG_DETECT_SOFTLOCKUP。但没有变化,我总是冻僵。所以这次让我们试试看门狗……
    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多