Debugging 使用QEMU调试自定义操作系统

Debugging 使用QEMU调试自定义操作系统,debugging,gdb,qemu,libvirt,virsh,Debugging,Gdb,Qemu,Libvirt,Virsh,我正在尝试编写一个简单的操作系统,我已经编写了一个引导加载程序,但现在我想调试它,所以我从使用VirtualBox切换到QEMU,因为我认为它有更好的调试。 问题是,在我将-s参数添加到QEMU命令并通过GDB成功连接之后,它表示符号表没有加载,应该使用“file”命令。 与我在互联网上看到的人所做的唯一不同之处在于,他们使用GDB vmlinux启动GDB,但我不能这样做,因为我没有调试Linux内核。。。所以我认为问题在于我没有用可执行文件启动GDB,而是在我的操作系统映像上使用“file”

我正在尝试编写一个简单的操作系统,我已经编写了一个引导加载程序,但现在我想调试它,所以我从使用VirtualBox切换到QEMU,因为我认为它有更好的调试。 问题是,在我将-s参数添加到QEMU命令并通过GDB成功连接之后,它表示符号表没有加载,应该使用“file”命令。 与我在互联网上看到的人所做的唯一不同之处在于,他们使用
GDB vmlinux
启动GDB,但我不能这样做,因为我没有调试Linux内核。。。所以我认为问题在于我没有用可执行文件启动GDB,而是在我的操作系统映像上使用“file”命令,编译并链接的.out文件告诉我这是一个“DOS/MBR引导扇区”,所以我不能用它们中的任何一个启动GDB(我尝试过这样做,但GDB失败了)

我们将不胜感激


编辑:另外,我用-g和--gstabs+选项组装了引导加载程序。

gdb需要一个文件,以便它可以为您提供符号调试信息。为此,您需要为它提供一个包含调试信息的文件,该文件的格式与您的操作系统在RAM中的位置相对应。“DOS/MBR引导扇区”文件是一个磁盘映像(BIOS会为您将其中的一部分加载到RAM中,然后它可能会自行完成加载代码)

但gdb也完全乐意让您进行汇编级调试;您可以忽略关于没有符号表的警告,使用单步指令、从pc反汇编和类似命令:

  • “disas$pc,+32”从当前pc反汇编32字节
  • display命令在执行停止后打印,因此每次gdb获得控制时,“disp/3i$pc”将打印接下来的3条指令
  • “stepi”和“nexti”执行单个指令步骤/下一步(“步骤”和“下一步”是源代码行步骤,需要调试信息)

谢谢您的回答,但GDB不识别“从pc反汇编”命令,我无法单步执行,因为GDB“无法找到当前函数的边界”。。。有什么建议吗?“反汇编”是命令;'“帮助”提供帮助。您可以通过指定起始和长度从PC反汇编,例如“disas$PC,+32”反汇编32字节。display命令也很有用,它在执行停止后打印:“disp/3i$pc”将在每次gdb获得控制时打印下3个insn。您需要使用“stepi”和“nexti”,它们执行单个insn step/next,而不是“step”和“next”,它们是源代码行步进;我已经编辑了我的答案,以便更具体地说明在没有调试信息的情况下工作的命令。