2017-08-18 101 views
-1

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

+0

gdb可以使用原始地址。请参阅帮助或手册。此外,没有什么能阻止你用调试信息构建你的asm代码,所以你可以使用标签和行号。 – Jester

+0

你可以用调试信息编译你的程序集文件(选项取决于汇编程序,但是使用NASM你可以使用-g -F dwarf)。您可以编译带有调试信息的_C/C++ _(GCC是'-g'选项)。您使用链接器创建ELF文件(此ELF文件包含调试信息)。如果您不使用GRUB并编写自己的引导加载程序,那么您需要使用诸如“objcopy”之类的东西将ELF exectuable转换为二进制文件。 –

+0

如果您使用NASM生成二进制文件而不是ELF,则必须重新构建生成的方式,因为NASM不支持用'-f bin'选项进行调试。 –

回答

0

我意识到,GDB使用C编译器(GCC)的目标文件

在puted标签GDB没有做到这一点当标签可用。否则,GDB将显示原始地址。

即使有其他“标签”可用,也不会阻止您在原始地址上设置断点。