Debugging 如何在QEMU中使用GDB对x86代码进行源代码级调试?

Debugging 如何在QEMU中使用GDB对x86代码进行源代码级调试?,debugging,assembly,x86,qemu,Debugging,Assembly,X86,Qemu,我为MBR部分编写了一个x86汇编程序。 我将其汇编如下: nasm hellombr.asm -f bin -o hellombr.img 然后我在qemu中运行它: qemu -fda hellombr.img -boot a 问题是如何在源代码级调试程序?使用qemu,而不是qemu。它是完全兼容的,尽管速度较慢。它也是一个仿真器,但如果您从源代码中创建它,请使用以下标志并按如下方式构建它: ./configure --enable-debugger --enable-disasm -

我为MBR部分编写了一个x86汇编程序。 我将其汇编如下:

nasm hellombr.asm -f bin -o hellombr.img
然后我在qemu中运行它:

qemu -fda hellombr.img -boot a

问题是如何在源代码级调试程序?

使用qemu,而不是qemu。它是完全兼容的,尽管速度较慢。它也是一个仿真器,但如果您从源代码中创建它,请使用以下标志并按如下方式构建它:

./configure --enable-debugger --enable-disasm --disable-docbook
make
make install
$ nasm hellombr.asm -f elf -g -o hellombr.elf $ objcopy -O binary hellombr.elf hellombr.img $ qemu -s -S -fda hellombr.img -boot a $ gdb (gdb) symbol-file hellombr.elf (gdb) target remote localhost:1234
您可以在代码中放置断点,逐步查看代码,查看GDT、IDT以及您需要了解的所有信息。

一个非常好(且简单)的方法是将IDA与bochs一起使用,您可以在其中找到一篇优秀的博文,以及引导加载程序开发的一些其他提示/建议。

您应该让
nasm
在ELF文件中创建调试符号,然后将其转储到一个平面二进制文件中,以便在MBR中使用。然后,您可以指示GDB从ELF文件中读取必要的符号

然后,整个过程将变成如下所示:

./configure --enable-debugger --enable-disasm --disable-docbook
make
make install
$ nasm hellombr.asm -f elf -g -o hellombr.elf $ objcopy -O binary hellombr.elf hellombr.img $ qemu -s -S -fda hellombr.img -boot a $ gdb (gdb) symbol-file hellombr.elf (gdb) target remote localhost:1234 $nasm hellombr.asm-f elf-g-o hellombr.elf $objcopy-O二进制hellombr.elf hellombr.img $qemu-s-s-fda hellombr.img-boot a $gdb (gdb)符号文件hellombr.elf (gdb)目标远程本地主机:1234
有关传递给
qemu的标志的说明,请参见答案。

您看过了吗?我知道GDB可以进行源代码级调试。这就是问题所在,我无法让GDB与源代码一起工作。NASM拒绝编译带有-g标志的平面二进制文件。