qemu和gdb问题

时间:2013-02-18 19:54:15

标签: linux-kernel gdb qemu

我有一个冻结操作系统的设备驱动程序。老鼠甚至不会移动。我正在尝试调试这个问题,我相信一个好的方法是使用gdb和qemu,这是我以前从未使用过的两件事。有更好的方法吗?

首先,我需要使用已经完成的调试符号编译内核。

现在,生成了一个名为vmlinux的新文件,该文件位于与源相同的文件夹中。看来我还需要一个bzImage文件according to this所以我可以运行新编译的内核:

qemu-system-i386 -kernel bzImage 

或处于调试模式

qemu-system-i386 -s -S -kernel bzImage

我找不到bzImage文件。我在哪里找到它或在这里缺少什么? bzImage是指我使用qemu-img create创建的操作系统映像吗?

另外,我不明白的是现在内核被编译(vmlinux)我如何用qemu运行它?所以我的问题是当我用qemu运行它或调试器是在我的主OS中作为应用程序运行的内核?

我该如何安装设备驱动程序?我对内核的理解不是Ubuntu,所以没有UI?

另外,我安装了qemu,当我输入qemu时,我找不到命令。我猜我必须选择qemu-system-i386,qemu-system-x86_64或qemu-x86_64中的特定处理器模拟器?

qemu与kvm命令有何不同或相似之处?

感谢。

1 个答案:

答案 0 :(得分:2)

因此,如果我正确理解了问题,那么您就拥有一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志中没有任何特殊内容。

以下内容可能会有所帮助。

获取日志

您描述的症状可能仍然是内核oops或恐慌的结果。日志记录工具有时会在将错误信息输出到日志文件之前死掉。您可以尝试通过串口输出日志,这应该更可靠。

由于您的内核模块不需要任何特定硬件,最简单的方法可能是安装与虚拟机相同的Linux发行版,并将该计算机的虚拟串行端口(COM)连接到主机上的管道系统。

这通常很容易做到。例如,this blog post包含主机操作系统和客户操作系统是Ubuntu 11.10的详细说明。

VirtualBox用于管理虚拟机。如果你更喜欢QEMU,这也是可能的。我认为使用VirtualBox更容易,但这是个人偏好的问题。

基本上,您需要执行以下步骤。

  • 创建一个虚拟机并在那里安装您作为访客操作系统所需的Linux发行版。
  • 在虚拟机的配置中启用串行端口(COM1,...)并将其配置为连接到主机上的特殊文件("主机管道"),例如{{1} }。
  • 启动客户操作系统并调整其启动选项:至少将/tmp/vbox_serial或类似内容添加到启动加载程序菜单中的内核选项。
  • 在主持人上,启动console=ttyS0,115200minicom或其他任何可以从socat读取的内容。
  • 就是这样。现在,您应该通过/tmp/vbox_serial获取来宾操作系统的内核日志。如果guest虚拟机系统崩溃,即使未将其保存到guest虚拟机本身的文件中,也会获取日志。

为了简化操作,您可以在主机系统上使用/tmp/vbox_serial,而不是该博客帖子的作者所建议的socat。这里可能不需要minicom的力量。

这样,您可以使用minicomsocat将日志保存到tee文件,同时仍将其输出到控制台:

guest.log

如果有内核oops或恐慌,日志中的回溯通常有助于找出内容 出了问题。

检测死锁

如果您已通过串行连接或其他方式获取完整日志,但仍然没有任何可疑信息,您怀疑内核中存在死锁, socat /tmp/vbox_serial - | tee guest.log 工具可能有所帮助。它包含在内核中(但您可能需要使用lockdep重建内核)。

Lockdep检测到潜在的死锁并将结果输出到内核日志。 This presentation可以帮助您分析其输出。

追踪设施

如果你需要跟踪内核中的一些事件来调试你的系统,有一些工具可以很方便。

  • Kprobes - 一种可以在内核中几乎任意位置设置的断点。可用于跟踪函数调用等,并具有适度的性能影响。
  • SystemTap - 一个强大的系统来分析内核中发生的事情。部分内容基于Kprobes。
  • Ftrace - 包含在内核中的跟踪系统,如果重要的话,产生的开销比Kprobes少。