【问题标题】:Qemu debugging an assembly kernelQemu 调试汇编内核
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2012-07-10
    • 2014-08-09
    • 1970-01-01
    • 2011-04-20
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多