首页 文章

qemu和gdb问题

提问于
浏览
3

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

所以首先我需要用已经完成的调试符号编译内核 .

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

qemu-system-i386 -kernel bzImage

或者在调试模式下

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

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

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

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

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

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

谢谢 .

1 回答

  • 2

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

    以下可能会有所帮助 .

    获取日志

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

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

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

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

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

    • 创建一个虚拟机并在那里安装您作为来宾操作系统所需的Linux发行版 .

    • 在虚拟机的配置中启用串行端口(COM1,...),并将其配置为连接到主机上的特殊文件("host pipe"),例如 /tmp/vbox_serial .

    • 启动客户操作系统并调整其引导选项:至少将 console=ttyS0,115200 或类似内容添加到引导加载程序菜单中的内核选项 .

    • 在主机上,启动 minicomsocat 或从 /tmp/vbox_serial 读取的任何其他内容 .

    • 就是这样 . 现在,您应该通过 /tmp/vbox_serial 获取来宾操作系统的内核日志到您的主机系统 . 如果guest虚拟机系统崩溃,即使未将其保存到guest虚拟机本身的文件中,也会获取日志 .

    为了方便起见,您可以在主机系统上使用 socat ,而不是该博客帖子的作者建议的 minicom . 这里可能不需要 minicom 的力量 .

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

    socat /tmp/vbox_serial - | tee guest.log
    

    如果有内核oops或恐慌,日志中的回溯通常有助于找出出错的地方 .

    检测死锁

    如果你通过串行连接或其他方式获得了完整的日志,但仍然没有任何可疑的东西,你怀疑内核中存在死锁, lockdep 工具可能有所帮助 . 它包含在内核中(但您可能需要使用 CONFIG_LOCKDEP_SUPPORT=y 重建内核) .

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

    追踪设施

    如果需要跟踪内核中的某些事件来调试系统,可以使用一些方便的工具 .

    • Kprobes - 一种可以在内核中几乎任意位置设置的断点 . 可用于跟踪函数调用等,具有适度的性能影响 .

    • SystemTap - a强大的系统来分析内核中发生的事情 . 部分内容基于Kprobes .

    • Ftrace - 内核中包含的跟踪系统,如果这很重要,则会产生比Kprobes更少的开销 .

相关问题