论文摘要
随着嵌入式系统复杂程度的不断提高,调试越来越被嵌入式系统开发人员所重视。对于诸如嵌入式操作系统和并发程序等具有不确定性的程序,传统的循环调试是不够的。可逆调试可以很好的解决由于程序的不确定性所带来的很多问题。基于记录与重放的逆向执行技术可以使得程序员通过记录下来的程序执行轨迹回滚到程序的任意点,并重演这一执行过程。这样程序员就可以快速的定位错误的根源,避免了反复重启调试会话的麻烦,同时还可以准确的重放错误的场景。基于开源的模拟器QEMU和通用调试器GDB,本文设计实现了可逆调试器PORD。PORD为嵌入式系统提供了一个高效的交叉可逆调试工具。它可以在通用的X86宿主架构上调试目标架构为ARM,SPARC,PPC或者MIPS的嵌入式系统。程序的执行状态主要包括寄存器状态和内存状态。对于寄存器状态的保存,PORD针对不同的目标架构采用不同的保存方法。而对于内存状态的保存,PORD对于不同的目标架构采用了统一的记录方法。为了减少记录执行轨迹所需要的时间与空间开销,检查点可以采用不同的记录粒度。同时PORD为X86目标架构实现了一个接近于本地执行速度的高效可逆调试器。PORD主要有两部分组成。一个是通过修改QEMU而实现记录与重放功能的虚拟机。另一部分是RGDB。RGDB通过在通用调试器GDB中扩充逆向执行命令而实现。RGDB解析用户命令,并且构建发送调试命令数据包到GDB调试桩。存在于虚拟机端的GDB调试桩解析收到的数据包,之后控制虚拟机执行相应的调试命令。实验表明可逆调试器PORD能够快速高效的重演程序的历史状态。对于调试而言,PORD记录日志的时间与空间开销是可以接受的。