论文部分内容阅读
随着计算机技术的飞速发展,在软件系统日益复杂的今日,程序分析技术正在软件开发维护的过程中扮演着越来越重要的角色。其中,程序切片技术能够反应出程序中语句在执行时的相互影响关系,帮助软件开发人员对程序的理解,因此可以被有效应用于程序理解和调试中。然而,由于程序切片算法本身相当耗时,无法满足交互式程序调试场景的低响应需求,极大地限制了程序切片的应用。本文通过分析传统基于程序依赖图的程序切片计算流程,认为其主要瓶颈在用于计算程序中依赖关系的数据流分析部分,同时结合交互式程序调试场景中,程序被频繁小规模修改而无法事先离线切片的问题,提出使用需求驱动式和增量式程序切片的方法进行优化。需求驱动式程序切片的基本思想是利用需求驱动式数据流分析的特点,依照切片的实际需求计算数据依赖,它主要针对传统算法计算大量最终未被使用的数据流信息的问题。增量式数据流切片的基本思想是预先计算好切片时需要的数据流信息,在程序被小规模修改时,利用增量式数据流分析进行局部更新后快速重新切片,主要针对在程序更改发生后需要从头计算程序切片的问题。本文基于Soot程序分析框架,针对Java编程语言,实现了基于上述优化方法的程序切片算法。本文从四个Apache开源软件项目中选取了10个真实的程序故障,在模拟的交互式调试场景的中与传统程序切片算法相比较。实验结果显示,程序切片能够剔除程序大量与程序故障无关的部分。同时本文实现的切片算法极大地提高了程序切片的运行效率,对于较小规模的程序,能够在一秒左右就做出响应,对于如Hadoop这样规模较大的程序,响应时间也被控制在了十秒的数量级,可以满足交互式调试场景的需求。