论文部分内容阅读
通过打印日志来增进调试是软件故障诊断中常用的方法。而在实际中相关日志缺失情况严重。对此我们针对一个具体的错误情景来增加日志以增进故障诊断:数组越界检查。静态数组越界检查是很常见的进行数组越界检查的方式,然而目前的典型静态数组越界检查工具在精确度和可用性之间难以取得平衡,即存在可用性与精确度的矛盾——高精确度的结果会导致分析时间的膨胀,而可接受的分析时间之内又不能给出较高的分析精度。除此之外,受静态分析局限,有很多数组边界分析情形这些工具完全不能进行检查。本文提出了一种基于编译分析和程序变换进行动态数组越界检查的方案。本文主要的工作和贡献包括: 1.实现了一个基于编译分析和程序变换技术的动态数组越界检查原型。通过对目标程序经过GCC编译产生的GIMPLE层次中间代码的遍历,分析数组边界的情形;并通过插装技术,动态检查数组越界并产生打印结果。 2.实现了一种基于循环分析算法及循环不变计算外提技术的日志优化方法。动态工具常常产生开销问题。针对已实现的动态数组越界检查原型,本文进行了针对开销的一系列优化,主要通过循环分析来完成。经过循环分析、SSA及DU链等分析,本文完成了在循环中数组下标为不变计算的外提技术,可以实现多重循环的分析、外提,能够在层层循环嵌套中精确外提到能保持该计算不变的最大外层循环。 3.实现了一种基于循环分析算法及延迟报错技术的日志优化方法。针对动态工具的开销问题,除循环不变计算外提的技术外,本文还使用了延迟报错技术。仍然通过进行循环分析,把报错的插装点从循环内部延迟到循环外部,从而降低性能开销。 本工具能够正确分析出静态工具不能处理的若干数组越界检查情形;通过对真实应用程序Apache服务器系统的测试,证明工具能够在实际生活情境中较完备地检查出数组越界并能够打印越界分析结果。另外,通过SPEC CPU2006测试用例集进行的性能开销方面实验表明,两个优化对降低性能开销作用卓著,证明本文的工具在具有了良好的完备性、实际应用中的可靠性的同时,具有不错的实用性(性能评价实验中优化版本仅增加了26%的性能开销)。