练习 2:使用 qemu 执行并调试 lab1 中的软件。(要求在报告中简要写出练习过程)

为了熟悉使用 qemu 和 gdb 进行的调试工作,我们进行如下的小练习:

  1. 从 CPU 加电后执行的第一条指令开始,单步跟踪 BIOS 的执行。
  2. 在初始化位置 0x7c00 设置实地址断点,测试断点正常。
  3. 从 0x7c00 开始跟踪代码运行,将单步跟踪反汇编得到的代码与 bootasm.S 和 bootblock.asm 进行比较。
  4. 自己找一个 bootloader 或内核中的代码位置,设置断点并进行测试。

提示:参考附录“启动后第一条执行的指令”,可了解更详细的解释,以及如何单步调试和查看 BIOS 代码。

提示:查看 labcodes_answer/lab1_result/tools/lab1init 文件,用如下命令试试如何调试 bootloader 第一条指令:

 $ cd labcodes_answer/lab1_result/
 $ make lab1-mon

补充材料: 我们主要通过硬件模拟器 qemu 来进行各种实验。在实验的过程中我们可能会遇上各种各样的问题,调试是必要的。qemu 支持使用 gdb 进行的强大而方便的调试。所以用好 qemu 和 gdb 是完成各种实验的基本要素。

默认的 gdb 需要进行一些额外的配置才进行 qemu 的调试任务。qemu 和 gdb 之间使用网络端口 1234 进行通讯。在打开 qemu 进行模拟之后,执行 gdb 并输入

target remote localhost:1234

即可连接 qemu,此时 qemu 会进入停止状态,听从 gdb 的命令。

另外,我们可能需要 qemu 在一开始便进入等待模式,则我们不再使用 make qemu 开始系统的运行,而使用 make debug 来完成这项工作。这样 qemu 便不会在 gdb 尚未连接的时候擅自运行了。

gdb 的地址断点

在 gdb 命令行中,使用 b *[地址]便可以在指定内存地址设置断点,当 qemu 中的 cpu 执行到指定地址时,便会将控制权交给 gdb。

关于代码的反汇编

有可能 gdb 无法正确获取当前 qemu 执行的汇编指令,通过如下配置可以在每次 gdb 命令行前强制反汇编当前的指令,在 gdb 命令行或配置文件中添加:

define hook-stop
x/i $pc
end

即可

gdb 的单步命令

在 gdb 中,有 next, nexti, step, stepi 等指令来单步调试程序,他们功能各不相同,区别在于单步的“跨度”上。

next 单步到程序源代码的下一行,不进入函数。
nexti 单步一条机器指令,不进入函数。
step 单步到下一个不同的源代码行(包括进入函数)。
stepi 单步一条机器指令。

results matching ""

    No results matching ""