跳转到内容

QEMU/使用 QEMU 调试

来自 Wikibooks,开放世界中的开放书籍

QEMU 提供了一种舒适的方式进行系统范围的调试;此环境特别适合于调试操作系统内核和固件。

实际上,您可以连接任何支持 GDB 远程协议的调试器。但是,在以下示例中,我们将使用 GNU 调试器。

开始调试会话

[编辑 | 编辑源代码]

阻止 CPU 启动

[编辑 | 编辑源代码]

使用 -S 命令行开关启动 QEMU 可以阻止 CPU 启动。这为调试器连接提供了时间,并允许从一开始就进行调试,甚至包括早期的平台固件。

要开始执行,您必须通过调试器或监视器控制台向 QEMU 发送“continue”命令。

连接到调试器

[编辑 | 编辑源代码]

-gdb {device} 命令行开关允许您指定 QEMU 在指定设备中等待连接。

它可以接受 serial, socket, udp, tcp, stdio 等。例如,-gdb tcp::9000 用于监听端口 9000,然后您可以在 GDB 中使用 target remote localhost:9000 连接到它。

-s 开关是 -gdb tcp::1234 的简写。

从 GDB 启动 QEMU

[编辑 | 编辑源代码]

可以从 GDB 内部启动 QEMU;您可以方便地将所需命令保存到一个文件,并让 GDB 加载该脚本。

例如,假设您有一个非常简单的自定义 MBR,它在 0x7E00 处的保护模式下加载内核,您可以使用类似以下内容调试两者

add-symbol-file stage0.elf 0x7c00
add-symbol-file stage1.elf 0x7e00
target remote | qemu -S -gdb stdio -m 16 -boot c -hda drive0.img

然后,您可以像这样启动它:gdb -x script.gdb

通过脚本编写和设置断点,可以实现更复杂的设置,同时考虑到运行时重新定位。这在调试引导代码时很常见,引导代码在加载下一阶段之前会重新定位自身(例如,标准 MBR)。

华夏公益教科书