基于qemu的低级调试

Dac*_*cav 13 embedded debugging gdb arm qemu

我将在ARM体系结构上测试一些低级代码.通常实验板上的实验非常复杂,所以我在想QEMU.

我想得到的是某种调试信息,如printfs或gdb.我知道这对于linux很简单,因为它实现了QEMU Integrator的设备驱动程序和gdb功能,但我不使用Linux.我还怀疑从Linux内核源代码中提取这种功能会很复杂.

我正在从一些已经实现其中一个功能的简单操作系统中搜索.你有什么建议吗?

Bro*_*ses 17

您不需要目标操作系统来调试在QEMU中运行的代码 - QEMU已经为您执行了此操作.

具体来说,QEMU支持从GDB进行远程调试 - 您可以使用适当的命令行选项运行QEMU,它将导出GDB副本(在主机上运行)可以连接的接口.此时,您可以在GDB中调试程序,就像在主机上运行它一样.

http://wiki.osdev.org/GDB似乎有更多的基本信息; 可能还不足以让你完全开始,但至少在QEMU和GDB文档中给出了基本的想法和一些要查找的术语.略过一下关于"实现GDB存根"的内容,由于QEMU已经有了,所以这里不适用,并从"使用仿真器存根"一节开始.简短形式就是你用QEMU -s选项(在localhost上导出GDB连接:1234)和-S选项(在开始执行前等待GDB"continue"命令),然后在主机上的GDB中你说target remote :1234而不是run.当然,您还需要使用ARM版本的GDB而不是native-x86版本.

(此外,如果您愿意为商业解决方案付费,CodeSourcery的ARM工具链具有IDE集成功能,可以自动设置所有这些,包括支持"printf"打印到调试器控制台.这适用于物理板如果你有一个硬件调试器也是如此.关于我作为CodeSourcery员工的通常免责声明适用 - 但我发现它很容易使用.)

更新,2012: CodeSourcery的工具链现在称为Mentor Graphics Sourcery CodeBench,但以上所有内容仍然适用.

  • 在某些情况下,您应该将 *-s* 替换为: **-gdb tcp::1234,ipv4** ipv4 参数强制 IPV4 连接而不是 IPV6,这是导致“无法建立连接,因为目标机器主动拒绝了它。消息。 (2认同)