嵌入式系统可逆调试器的设计与实现

嵌入式系统可逆调试器的设计与实现

论文摘要

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

论文目录

  • 摘要
  • Abstract
  • 第一章 绪论
  • 1.1 研究背景
  • 1.2 国内外研究现状
  • 1.3 研究内容
  • 1.4 本文的组织结构
  • 第二章 嵌入式系统可逆调试的相关技术
  • 2.1 嵌入式系统交叉调试
  • 2.1.1 硬件调试器
  • 2.1.2 软件调试器
  • 2.2 动态二进制翻译技术
  • 2.2.1 二进制翻译方法分类
  • 2.2.2 二进制翻译系统综述
  • 2.3 二进制植入技术
  • 2.4 逆向执行技术
  • 2.4.1 基于检查点的执行重放技术
  • 2.4.2 基于系统调用fork的执行重放技术
  • 第三章 基于QEMU的增量检查点设计与实现
  • 3.1 QEMU的总体框架
  • 3.1.1 QEMU的运行模式
  • 3.1.2 QEMU地址空间方案
  • 3.1.3 QEMU上层架构
  • 3.2 QEMU的执行流程
  • 3.2.1 QEMU的动态二进制翻译机制
  • 3.2.2 系统调用的模拟
  • 3.3 增量检查点设计与实现
  • 3.3.1 检查点的设计
  • 3.3.2 寄存器状态保存
  • 3.3.3 内存状态的记录
  • 3.3.4 系统调用模拟
  • 第四章 可逆调试器PORD的设计与实现
  • 4.1 可逆调试器PORD的总体架构
  • 4.2 基于检查点的可逆执行
  • 4.2.1 寄存器状态重建
  • 4.2.2 内存状态重建
  • 4.3 RGDB的设计与实现
  • 4.3.1 逆向调试命令的实现方式
  • 4.3.2 GDB调试桩的实现
  • 第五章 实验验证
  • 5.1 交叉编译工具链的构建
  • 5.2 实验环境与实现选取
  • 5.3 性能测试
  • 第六章 总结与展望
  • 致谢
  • 参考文献
  • 作者在读研期间的研究成果
  • 附录
  • 相关论文文献

    标签:;  ;  ;  

    嵌入式系统可逆调试器的设计与实现
    下载Doc文档

    猜你喜欢