所以,如果我正确理解了这个问题,那么你就有一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志没有任何特别之处。
以下内容可能会有所帮助。
获取日志
您描述的症状可能仍然是内核 oops 或恐慌的结果。日志记录工具有时在将有关错误的信息输出到日志文件之前就死了。您可以尝试通过串口输出日志,这样应该更可靠。
由于您的内核模块不需要任何特定硬件,因此最简单的方法可能是安装与您使用的虚拟机相同的 Linux 发行版,并将该机器的虚拟串行端口 (COM) 连接到主机系统上的管道。
这通常很容易做到。例如,这篇博文包含主机操作系统和客户操作系统是 Ubuntu 11.10 的详细说明。
VirtualBox用于管理虚拟机。如果您更喜欢 QEMU,这也应该是可能的。我认为使用 VirtualBox 会更容易一些,但这是个人喜好问题。
基本上,您需要执行以下步骤。
- 创建一个虚拟机并在那里安装您需要的 Linux 发行版作为来宾操作系统。
- 在虚拟机的配置中启用串行端口(COM1,...)并将其配置为连接到主机上的特殊文件(“主机管道”),例如
/tmp/vbox_serial.
- 启动来宾操作系统并调整其引导选项:至少,
console=ttyS0,115200在引导加载程序菜单中的内核选项中添加或类似的内容。
- 在主机上, start
minicom或socat其他要读取的内容/tmp/vbox_serial。
- 这就对了。现在您应该通过
/tmp/vbox_serial. 如果来宾系统崩溃,您将获得日志,即使它没有保存到来宾本身的文件中。
为了使事情更容易,您可以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 产生的开销更少。