- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个嵌入式板,带有数千行内核模块,它会在随机时间和随机复杂的用例上卡住。我尝试调试它的解决方案是什么?
我已经尝试过神奇的系统请求,但它不起作用。我想解释是我在禁用硬件中断的代码中处于循环或死锁?
谢谢,伊娃。
最佳答案
通常,嵌入式板有 watch dog 。您应该启用此计时器并使用 watchdog
用户进程踢看门狗硬件。在watchdog
进程上使用nice
,以便更高优先级的任务必须放弃CPU。这为问题提供了线索。如果设备在看门狗处于事件状态时未重置,则可能只有网络或串行端口停止了通信。即,内核还没有锁定。问题是没有用户可见的事件。如果/当现场发生此类问题时,看门狗也很有用。
对于内核锁定情况,lockup watchdogs内核功能可能有用。如果您有推测的无限循环/死锁,这将起作用。但是,如果这是定制硬件,则SDRAM或外围设备也有可能锁住并导致异常总线事件。这将阻止 CPU 获取正确的代码;显然,Linux 很难从中恢复过来。
您可以将看门狗与一些用作跟踪缓冲区的闲置内存结合起来。 memmap=
和 mem=
可以限制内核使用的内存。可以编写使用此内存的驱动程序/设备来保存重新启动后仍保留的跟踪点。当内核启动时检测到看门狗重置时,闲置内存的环形缓冲区将被转储。
注册线程也很有用notifiers如果问题可重复或发现如何使事件可重复,则可以在上下文切换时执行 printk 。一旦确定了导致锁定的一系列事件,您就可以使用范围或逻辑分析器来进行一些最终诊断。或者,此时哪个外围设备出现问题可能很明显。
您还可以在内核命令行上设置panic=-1
和reboot=...
。 kdump如果您只有代码问题,那么这些设施很有用。
相关:kernel trap (at web archive) 。此链接可能不再可用,但对于此答案并不重要。
关于linux-kernel - 内核卡住 : How to debug it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9860498/
我是一名优秀的程序员,十分优秀!