所以,如果我正确理解问题,您有一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志中没有特殊信息。
以下内容可能有帮助。
获取日志
您描述的症状仍可能是内核 oops 或 panic 的结果。记录设施有时会在输出有关错误的信息到日志文件之前死亡。您可以尝试通过串行端口输出日志,这应该更可靠。
由于您的内核模块不需要任何特定的硬件,最简单的方法可能是将与您使用相同的 Linux 发行版安装到虚拟机中,并将该机器的虚拟串行端口(COM)连接到主机系统上的管道中。
这通常很容易做到。例如,如果主机操作系统和客户操作系统都是 Ubuntu 11.10,则
this blog post 包含详细说明。
VirtualBox 用于管理虚拟机。如果你更喜欢 QEMU,也可以使用它。我想使用 VirtualBox 更容易些,但这取决于个人偏好。
基本上,你需要执行以下步骤。
- 创建一个虚拟机并安装您需要的Linux发行版作为其中的guest OS。
- 在虚拟机的配置中启用串口(COM1,...)并将其配置为连接到主机上的特殊文件(“host pipe”),例如
/tmp/vbox_serial
。
- 启动guest OS并调整其引导选项:至少在引导加载程序菜单中添加
console = ttyS0,115200
或类似选项。
- 在主机上启动
minicom
、socat
或其他任何工具以从/tmp/vbox_serial
读取。
- 这就是全部。现在,通过
/tmp/vbox_serial
,您应该能够获得guest OS的内核日志,它会流向您的主机系统。如果客户系统崩溃,您仍然可以获取该日志,即使它未保存在guest系统的文件中。
为了使事情更容易,您可以在主机系统上使用socat
而不是该博客文章作者建议的minicom
。在这里,可能不需要使用minicom
的强大功能。
这样,您可以使用
socat
和
tee
将日志保存到
guest.log
文件中,同时仍然将其输出到控制台:
socat /tmp/vbox_serial - | tee guest.log
如果发生内核oops或panic,日志中的回溯通常有助于找出问题所在。
检测死锁
如果您通过串行连接或其他方式获取了完整的日志,仍然没有发现任何可疑情况,并且您怀疑内核发生了死锁,则lockdep
工具可能会有所帮助。它包含在内核中(但您可能需要重新构建内核并启用CONFIG_LOCKDEP_SUPPORT=y
)。
Lockdep检测潜在的死锁并将结果输出到内核日志中。此演示文稿可以帮助您分析其输出。
跟踪工具
如果您需要跟踪内核中的某些事件以调试系统,则有一些有用的工具可供使用。
- Kprobes - 一种可以在内核中几乎任意位置设置的断点。可用于跟踪函数调用等,对性能有适度影响。
- SystemTap - 一个强大的系统,用于分析内核中正在发生的事情。其中一部分基于 Kprobes。
- Ftrace - 一个包含在内核中的跟踪系统,如果需要,比 Kprobes 的开销更小。