【发布时间】:2018-01-27 08:59:50
【问题描述】:
我正在用汇编语言编写一个操作系统(引导加载程序和内核),我正在使用 QEMU 对其进行调试。
我想设置一些调试断点来暂停执行并一次只执行一条指令(单步)。我还想在运行时读取和设置寄存器和内存内容。我读到一种方法是使用 GDB。问题是我在搜索它之前和之后都没有使用过 GDB,我意识到 GDB 使用了 C 编译器 (gcc) 在目标文件中放置的标签,不是吗?但正如我所说,我正在用汇编语言编写(使用 NASM)并且我有纯原始二进制文件,那么该怎么做呢?是否存在另一种方式?也许我可以创建自己的 GDB 服务器或类似的东西吗?
【问题讨论】:
-
gdb 可以使用原始地址。请参阅帮助或手册。此外,没有什么能阻止您使用调试信息构建您的 asm 代码,因此您可以使用标签和行号。
-
您可以编译带有调试信息的程序集文件(选项取决于汇编程序,但对于 NASM,您可以使用 -g -F dwarf)。您使用调试信息编译 C/C++(GCC 是
-g选项)。您使用链接器创建 ELF 文件(此 ELF 文件包含调试信息)。如果您没有使用 GRUB 并编写了自己的引导加载程序,那么您需要使用objcopy之类的东西将 ELF 可执行文件转换为二进制文件。 -
如果您使用 NASM 生成 BINary 文件而不是 ELF,您将不得不重新构建您的构建方式,因为 NASM 不支持使用
-f bin选项进行调试的方式。跨度> -
如果您在 github 上有一个项目,也许可以为您提供更多帮助。这个问题对于 SO 来说可能过于宽泛,因为它取决于您如何构建引导加载程序和内核并将它们捆绑在一起。
-
GDB 也不能很好地调试 16 位代码。可以做到,但有局限性。如果都是 32 位代码,那就更简单了。
标签: debugging assembly gdb qemu osdev