Debugging Qemu调试汇编内核

Debugging Qemu调试汇编内核,debugging,assembly,gdb,qemu,osdev,Debugging,Assembly,Gdb,Qemu,Osdev,我正在汇编(引导加载程序和内核)中编写操作系统,并使用QEMU对其进行调试。 我想设置一些调试断点来暂停执行,一次只执行一条指令(单步执行)。我还想在运行时读取和设置寄存器和内存内容。我读到这样做的一种方法是使用GDB。问题是我在搜索之前和之后都没有使用GDB,我意识到GDB使用的是C编译器(gcc)在对象文件中放置的标签,不是吗?但正如我所说,我正在汇编(使用NASM)中编写,我有一个纯原始二进制文件,那么如何做到这一点呢?存在另一种方式吗?也许我可以创建自己的GDB服务器或类似的东西 我意识

我正在汇编(引导加载程序和内核)中编写操作系统,并使用QEMU对其进行调试。
我想设置一些调试断点来暂停执行,一次只执行一条指令(单步执行)。我还想在运行时读取和设置寄存器和内存内容。我读到这样做的一种方法是使用GDB。问题是我在搜索之前和之后都没有使用GDB,我意识到GDB使用的是C编译器(gcc)在对象文件中放置的标签,不是吗?但正如我所说,我正在汇编(使用NASM)中编写,我有一个纯原始二进制文件,那么如何做到这一点呢?存在另一种方式吗?也许我可以创建自己的GDB服务器或类似的东西

我意识到GDB使用C编译器(gcc)在对象文件中放置的标签

当标签可用时,GDB会这样做。如果没有,GDB将显示原始地址


没有什么可以阻止您在原始地址上设置断点,即使其他“标签”可用。

gdb可以使用原始地址。请参阅帮助或手册。此外,没有任何东西可以阻止您使用调试信息构建asm代码,因此您可以使用标签和行号。您可以使用调试信息编译汇编文件(选项取决于汇编程序,但使用NASM可以使用-g-F dwarf)。编译C/C++时,调试信息处于打开状态(GCC是
-g
选项)。使用链接器创建ELF文件(此ELF文件包含调试信息)。如果您没有使用GRUB并编写自己的引导加载程序,那么您需要使用类似于
objcopy
的东西将ELF可执行文件转换为二进制文件。如果您使用NASM生成二进制文件,而不是ELF,则必须重新构造构建方式,因为NASM不太支持使用
-f进行调试bin
选项。如果您在github上有一个项目,one可能会为您提供更多帮助。这个问题可能太宽泛了,这取决于如何构建引导加载程序和内核,并将它们绑定在一起。这是可以做到的,但也有局限性。如果全部是32位代码,那么就更容易了。