【发布时间】:2015-11-13 16:34:08
【问题描述】:
我想使用 bochs 来调试一个用 nasm 程序集编写的迷你操作系统。我希望找到一条指令来在源代码的某一行设置断点。但是从这里的文档中:http://bochs.sourceforge.net/cgi-bin/topper.pl?name=New+Bochs+Documentation&url=http://bochs.sourceforge.net/doc/docbook 您只能在某个物理地址、虚拟地址或线性地址处设置断点。如何知道源代码中某行对应的地址是什么?
【问题讨论】:
-
您需要从您的构建工具链(例如 objdump 或程序集列表文件)中提取该信息,当然您还需要了解您自己的加载程序(加载内容的位置)。
-
如果您知道要设置断点的位置,并且您的操作系统已编译为 Intel 程序集,您可以在您的操作系统源代码中插入
0xccakaint 3指令(并重新编译)触发调试器中断。 -
基于上面@Kenney 的评论,bochs supports magic breakpoints (
xchg bx, bx) 因为int3通常保留在虚拟机内,不会突破到 bochs 调试器。 -
你在什么环境下,我很好奇你有能力编译带有gdbstub支持的Bochs吗?我不知道内部 Bochs 调试器,但我已经成功地使用 gdb 使用与 Bochs 的远程会话来使用 ELF32 格式二进制文件中的符号调试信息设置断点(nasm 可以产生此类信息)。您的操作系统是 16 位还是 32 位代码?
-
@MichaelPetch 它是在 Armv7l 上运行的 32 位 kubuntu。它是运行 kubuntu 的 chromebook。我从未尝试过使用 gdbstub 进行编译,但据说 bochs 是平台无关的。