【问题标题】:Debugging bootloader with gdb in qemu在 qemu 中使用 gdb 调试引导加载程序
【发布时间】:2012-12-23 22:58:14
【问题描述】:

Freedos 引导加载程序似乎存在问题。 (在某些情况下,引导代码似乎找不到内核。)

所以我正在尝试使用 gdb 调试 qemu 中的引导加载程序。按照在几个 wiki 和免费在线课程资料上找到的说明,我像这样运行 qemu

qemu-system-i386 -fda fdboot.img -boot a -s -S

然后像这样连接gdb

$ gdb
(gdb) target remote localhost:1234

我可以使用 si 逐步完成前 10 到 12 条指令,我认为这是 SeaBIOS。

但除此之外,当我尝试进入引导加载程序代码时,它会继续执行而不会中断,一直到 FreeDos 菜单提示。这完全跳过了我想在执行时逐步检查的引导加载程序代码。

我需要做什么才能逐步通过引导加载程序?

[如果您想自己尝试,可以从项目网站下载freedos软盘镜像。]

【问题讨论】:

  • 替代建议:BOCHS 有一个内置调试器,可让您单步启动引导扇区。

标签: debugging assembly gdb bootloader qemu


【解决方案1】:

在这里使用 qemu 1.3 和 gdb 7.3.50.20111117 工作正常(你没有说你使用的是什么版本)。 我能够单步执行大量指令,直到我感到无聊并放置一个断点来捕获引导加载程序:

(gdb) br *0x7c00
Breakpoint 1 at 0x7c00
(gdb) c
Continuing.

Breakpoint 1, 0x00007c00 in ?? ()
(gdb) x/i $eip
=> 0x7c00:      jmp    0x7c3e

请注意,我首先使用 set architecture i8086 将 gdb 设置为 16 位模式。

【讨论】:

  • 我正在使用 gdb 7.5-ubuntu 和 qemu 1.2.0(qemu-kvm-1.2.0+noroms-0ubuntu2,Debian)。是的,我尝试在 *0x7c00 处设置断点,但它似乎只是越过了那个地址,从未中断,到达 Freedos 的交互式菜单。我还尝试将架构设置为 i8086,没有区别。我会尝试从 trunk/head 编译 qemu 和 gdb 看看是否有什么不同。
  • 是的,我从 HEAD 编译了 qemu,现在我可以成功地单步执行所有指令了。
  • 从 HEAD 编译 qemu 是什么意思?我以前从未听说过。我有同样的问题,但我不知道从 HEAD 编译是什么意思。需要详细说明吗? :)
  • @Rob HEAD 表示来自修订控制系统的当前版本,即最新的开发状态。通常建议仅在最新版本(包)不适合您时才这样做。
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2014-07-16
  • 2013-04-22
  • 2021-03-30
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多