在qemu中使用gdb调试引导加载程序

16

似乎Freedos引导程序存在问题。(在某些情况下,启动代码无法找到内核。)

所以我正在尝试使用gdb在qemu中对引导程序进行调试。遵循几个维基和免费的在线课程材料上的指示,我这样运行qemu

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

然后像这样连接gdb

$ gdb
(gdb) target remote localhost:1234

我可以使用si命令逐步执行前10到12条指令,这些指令是SeaBIOS的。

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

我需要做什么才能逐步执行引导加载程序呢?

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


1
备选建议:BOCHS具有内置调试器,可让您逐步执行引导扇区。 - Peter Cordes
1个回答

20

使用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,看看是否有任何区别。 - rhlee
是的,我从HEAD编译了qemu,现在可以成功地逐步执行所有指令。 - rhlee
@Rob HEAD 意味着来自版本控制系统的当前版本,即开发的最新状态。通常建议仅在最新发布(软件包)无法正常工作时才这样做。 - Jester
设置架构i8086似乎不再起作用了:我得到了“Remote 'g' packet reply is too long (expected 312 bytes, got 536 bytes):”和一些长的十六进制转储 :q 在非8086模式下,它会错误地反汇编指令(例如远跳转为“(bad)”)。 - SasQ
QEMU和GDB的哪个版本? - Jester
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接