我有一个设备驱动程序正在冻结操作系统。老鼠甚至动也不动。我正在尝试调试这个问题,我相信一种很好的方法是在qemu中使用gdb,这是我以前从未使用过的两种方法。有没有更好的方法?
因此,首先,我需要用调试符号编译内核,我已经这样做了。
现在,有一个名为vmlinux的新文件被生成,它位于与源相同的文件夹中。看来,我还需要一个bzImage文件根据这个,这样我就可以使用以下方法运行新编译的内核:
qemu-system-i386 -kernel bzImage 或处于调试模式
qemu-system-i386 -s -S -kernel bzImage我无法找到bzImage文件。我在哪里能找到它或者这里缺了什么?bzImage是指我使用创建的OS映像吗?
另外,我不明白的是,现在内核已经编译(vmlinux),我是如何使用qemu运行它的?所以我的问题是,当我用qemu运行它时,还是调试器在我的主操作系统中作为应用程序运行的内核?
另外,如何安装我的设备驱动程序?我的理解是内核不是Ubuntu,所以没有UI?
另外,我安装了qemu,当我输入qemu时,我得到命令not。我猜我必须选择一个特定的处理器仿真器,如qemu i 386、qemu-system-x86_64或qemu-x86_64?
qemu与kvm命令有何不同或相似之处?
谢谢。
发布于 2013-02-20 07:51:27
因此,如果我正确理解这个问题,那么您就有了一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但是内核日志没有包含任何特殊的内容。
以下内容可能会有所帮助。
拿到日志
您所描述的症状可能仍然是内核oops或恐慌的结果。日志记录工具有时在将有关错误的信息输出到日志文件之前就会死掉。您可以尝试通过串口输出日志,这应该更可靠。
由于内核模块不需要任何特定的硬件,最简单的方法可能是安装与虚拟机相同的Linux发行版,并将该机器的虚拟串口(COM)连接到主机系统上的管道。
这通常是很容易做到的。例如,这篇博客文章包含详细的说明,以防主机操作系统和来宾操作系统是Ubuntu11.10。
在那里使用VirtualBox来管理虚拟机。如果您更喜欢QEMU,这也应该是可能的。不过,我认为使用VirtualBox要容易一些,但这是个人偏好的问题。
基本上,您需要执行以下步骤。
/tmp/vbox_serial。console=ttyS0,115200或类似的内容添加到引导加载程序菜单中的内核选项中。minicom、socat或其他从/tmp/vbox_serial读取的内容。/tmp/vbox_serial获得客户操作系统的内核日志。如果来宾系统崩溃,那么即使日志没有保存到客户本身的文件中,也会得到日志。为了让事情变得更简单,您可以在您的主机系统上使用socat,而不是像博客文章的作者所建议的那样使用minicom。这里可能不需要minicom的强大功能。
这样,您可以使用socat和tee将日志保存到guest.log文件,同时仍将其输出到控制台:
socat /tmp/vbox_serial - | tee guest.log如果存在内核oops或惊慌,日志中的回溯通常有助于找出哪里出了问题。
检测死锁
如果您已经通过串行连接或其他方式获得了完整的日志,但是仍然没有什么可疑之处,并且您怀疑内核中存在死锁,那么lockdep工具可能会有所帮助。它包含在内核中(但您可能需要用CONFIG_LOCKDEP_SUPPORT=y重新构建内核)。
Lockdep检测潜在的死锁并将结果输出到内核日志。这份报告可以帮助您分析其输出。
追踪设施
如果您需要跟踪内核中的某些事件来调试您的系统,那么可以使用一些工具。
https://stackoverflow.com/questions/14944229
复制相似问题