调试内核挂起

时间:2010-05-07 21:35:54

标签: linux-kernel embedded-linux

我正在尝试运行使用内核模式驱动程序的应用程序。系统每小时锁定一次,恢复它的唯一方法是硬重置。 Sysrq停止响应,telnet会话挂起,没有任何类型的错误消息。不幸的是,董事会没有ejtag支持。我一直试图在功能上隔离它,但这就像在干草堆中寻找一根针。有什么建议吗?

PS:这是一个mips linux系统(2.6.31)。

3 个答案:

答案 0 :(得分:3)

以下是一些选项,具体取决于具体情况。如果您可以提供有关平台和内核模式驱动程序性质的更多详细信息,那将会很有帮助。

假设您有理由对硬件充满信心,您可能的锁定源是锁定内核中的问题,未初始化的变量以及禁用抢占的无限循环。

您是否可以配置定时器中断以定期运行并使LED闪烁?您可能会发现在锁定期间查看是否继续处理中断很有用。

在Linux内核黑客菜单中启用软锁定检测,以及任何其他相关内核黑客攻击功能。 Linux可能需要一两分钟检测并报告软锁定。你有足够的时间等待检查吗?

在内核黑客中启用锁定相关性检查,并修复驱动程序中任何报告的锁定错误。

尝试更改内核抢占模式。这会更改某些系统锁的行为,在某些情况下会将死锁转换为危害较小的锁。如果相关/可能,请禁用SMP。

答案 1 :(得分:1)

不幸的是,如果没有sysreq操作,或者某种方式戳到底层系统,你就不走运了。

如果您可以从系统中获得某些行为(可能是硬件看门狗?),我会推荐kdump。

此外,如果这是一个更新的问题,请先将驱动程序的代码二等分,以确定崩溃发生的位置。

答案 2 :(得分:0)

如果内核没有完全挂起并且你仍然在中断,你可以使用KGDB。

如果您不能这样做,您可以向驱动程序添加更多日志记录代码以跟踪问题的根源。我会在每个函数的条目上至少放置一个printk(),也可能在每个函数的每个出口处放置一个。这应该至少可以帮助您找出问题发生的位置。