378
软件学报 2022 年第 33 卷第 2 期
can help boost state-of-the-art f ault localization. Note th at even st ate-of-the-art program repair t echniques can only fix a s mall ratio of real
bugs (e.g., <20% for Defects4J) and simply abort for the vast majority of unfixed bugs. In contrast, unified debugging not only directly
fixes bugs when possible, but also provides debugging hints for bugs that cannot be automatically fixed (e.g., the patch execution
information from such unsuccessful repair can still help boost fault localization for manual repair). Although demonstrated to be a
promising direction, unified debugging relies on massive test executions (i.e., million test executions) and can cost hours for execution.
This work proposes AUDE to accelerate unified debugging by reducing test executions that provide little helpful feedback for improving
fault localization. Specifically, AUDE first constructs an initial execution order of patches guided by Markov ch ain Monte Carlo sampling
strategy, and then adaptively estimates th e likelihood of each patch being infor mative during patch execution on-th e-fly. The result s o n t he
widely-used Defejcts4J benchmark show that AUDE significantly accelerates ProFL by reducing 70.29% of test executions with
negligible effectiveness drop in both fault localization and program repair, e.g., AUDE can localize the same number of bug methods at
Top-1/ Top-3/Top-5 as ProFL.
Key words: software quality assurance; soft ware testing; software d ebugging; f ault lo calization; progr am r epair
软件缺陷(software bug)普遍存在于软件系统中, 而软件缺陷调试(deb uggi ng)往往代价巨大且具有挑战性.
因此, 为了降低软件缺陷调试过程中的人工代价, 软件缺陷自动调试领域受到了非常广泛的关注. 其中, 最主
要的两个核心问题就是缺陷定位和程序修复. 缺陷定位技术, 通过静态或者动态的程序分析技术来识别程序
中可能出错的代码元素. 比较常见的缺陷定位技术包括基于频谱
[110]
、基于变异
[1113]
和基于程序切片
[10]
等.
给定一个含有缺陷的程序, 缺陷定位技术通常会产生一个依照出错可能性(通常被称为可疑度)降序排序的程
序元素列表. 随后, 开发者可通过从头遍历该列表, 依次检查程序元素, 从而加速人工修复的过程. 程序自动
修复技术
[1426]
旨在没有人工干预的情况下, 自动化地修复程序中的缺陷. 通常来说, 程序自动修复技术往往
会先应用已有的缺陷定位技术来识别可能出错的代码元素, 然后在此基础上进行后续的补丁生成. 例如, 很
多近期的程序自动修复技术
[2729]
的第 1 步即是应用基于频谱的缺陷定位技术 Ochiai
[30]
来识别出错的代码元
素. 缺陷定位和程序修复这两个领域自提出以来已被研究了很多年, 在传统的调试场景下, 缺陷定位和程序
修复通常以这种单向的方式进行连接. 但是, 目前无论是缺陷定位还是程序修复技术在实际中都仍未得到广
泛的应用
[31,32]
: 已有的缺陷定位技术在实际中的效果表现仍然非常有限
[33,34]
, 而已有的程序自动修复技术只
能修复很小的一部分(在数据集上 Defects4J
[35]
不到 20%)真实缺陷
[2729,3 6,3 7]
或者某一类特定的程序缺陷
[34]
.
最近, 一种双向连接缺陷定位和程序修复的统一化调试方法
[31,32]
被提了出来. 作为首个统一化调试方法,
ProFL
[31,32]
利用了大量修复过程中产生的补丁执行信息来逆向提升已有缺陷定位技术的效果. 该技术不仅将
程序自动修复的适用范围拓展到了所有缺陷(不仅仅是原来小部分可以被自动修复技术成功解决的缺陷), 而
且也大幅度提升了已有缺陷定位技术的效果. 例如, ProFL 通过利用修复工具 PraPR
[27]
在修复过程中产生的补
丁信息, 不仅比主流的基于频谱和基于变异的缺陷定位技术至少多将 37.6%的缺陷代码元素排到可疑度列表
第一位, 而且在效果上也超越主流的基于学习的非监督和监督缺陷定位技术
[38,39]
.
虽然颇具前景, 但统一化调试方法中仍存在着不容忽视的效率问题. ProFL 工作提到了其中存在的效率问
题, 并且提出了只使用部分补丁执行矩阵信息来辅助提升缺陷定位的建议. 例如: 优先执行之前失败的测试
用例然后再执行之前通过的测试用例, 并且一旦有任意测试用例在当前补丁上执行失败就终止当前补丁的执
行. 尽管应用了上述效率优化策略, 但对于 Def ect s4J 中的大型项目(例如 Closure), ProFL 仍然要花费很多个小
时来收集必须的补丁执行信息
[31,32,4 0]
. 这个过程往往涉及到了百万级别的测试用例执行(值得注意的是: 对于
每一个补丁执行, 往往存在多个测试执行).
考虑到统一化调试所依赖的大量测试执行已成为其实际应用中的一大难题, 在本文中, 我们提出了一种
统一化调试加速技术, 旨在更好地平衡统一化调试的效率和效果. 我们的基本思想是: 在海量需要被执行的
补丁中, 存在着很多对提升缺陷定位没有帮助因此也没有必要被执行的补丁. 在本文中, 我们将这一类补丁
称为无信息性补丁. 相应地, 对于那些可以提供改善定位效果的反馈信息的补丁, 我们则称其为信息性补丁.
基于这一思想, 提出了 AUDE (accele rating unified debugging), 一种基于补丁是否具有信息性以优化补丁执行
的统一化调试加速技术. AUDE 主要分成两个部分, 包括初始优化和补丁执行过程中的自适应性推导: 在初始
评论