一种基于崩溃栈数据的软件缺陷代码定位方法
【技术领域】
[0001] 本发明涉及一种基于崩溃栈数据的软件缺陷代码定位方法,属于软件测试维护技 术领域。
【背景技术】
[0002] 计算机软件在开发和维护过程中不可避免地产生软件缺陷,缺陷定位是软件调试 过程中一件耗时耗力的工作,对大规模软件系统更是如此。软件缺陷定位一直是软件工程 研究领域中的热点问题之一。缺陷定位利用代码执行信息和缺陷(问题)报告,预测缺陷 代码的可能范围,辅助开发人员找到缺陷位置。当前软件系统规模越来越大,代码文件越来 越多,根据缺陷报告内容,从海量的代码文件中定位到缺陷代码的过程可谓是大海捞针。此 外,在软件开发周期中,庞大的软件规模和有限的开发和测试成本之间也形成反差。
[0003] 目前缺陷代码定位仍然以人工定位和经验判定为主,多利用交互式的调试工具, 需要大量人工干预,定位效率低,耗费大量时间和成本,且不可重复,难以满足和适应大规 模软件系统的调试需求。近年来,研究者提出一些自动缺陷代码定位方法,但是这些方法多 需要获取软件执行过程的动态信息,如代码覆盖数据和执行轨迹等,适用于小范围语句级 的软件缺陷定位;尚不能满足大规模软件系统在函数和过程级的缺陷定位要求。
【发明内容】
[0004] 针对上述技术问题,本发明所要解决的技术问题是提供一种基于崩溃栈数据的软 件缺陷代码定位方法,应用机器学习技术,能够快速定位软件中包含缺陷的代码单元,有效 提高软件代码修复的工作效率。
[0005] 本发明为了解决上述技术问题采用以下技术方案:本发明设计了一种基于崩溃栈 数据的软件缺陷代码定位方法,包括如下步骤:
[0006] 步骤001.收集软件系统的历史崩溃栈数据和历史代码维修记录,并分别针对各 个历史崩溃栈数据,获得历史崩溃栈数据所对应的各个历史崩溃代码单元,构成所有历史 崩溃栈数据所对应的历史崩溃代码单元集合,并进入步骤〇〇2 ;
[0007] 步骤002.分别针对历史崩溃代码单元集合中的各个历史崩溃代码单元,获得历 史崩溃代码单元的各个预设特征指标的特征值;然后分别针对各个历史崩溃代码单元,将 历史崩溃代码单元转化为其所对应各个预设特征指标的特征值组成的特征向量,获得各个 历史崩溃代码单元所分别对应的特征向量,并进入步骤003 ;
[0008] 步骤003.根据历史代码维修记录,结合各个历史崩溃代码单元所分别对应的特 征向量,分别判断各个历史崩溃代码单元是否包含缺陷;然后针对包含缺陷的各个历史崩 溃代码单元,获得由该各个历史崩溃代码单元所对应特征向量组成的特征向量矩阵,构成 训练集,并进入步骤004;
[0009] 步骤004.应用训练集,针对预设分类器进行训练,获得经过训练的分类器,并进 入步骤005 ;
[0010] 步骤005.针对各个目标崩溃栈数据,获得各个目标崩溃栈数据分别所对应的各 个目标崩溃代码单元,构成所有目标崩溃栈数据所对应的目标崩溃代码单元集合,并进入 步骤006 ;
[0011] 步骤006.分别针对目标崩溃代码单元集合中的各个目标崩溃代码单元,获得目 标崩溃代码单元的各个预设特征指标的特征值;然后分别针对各个目标崩溃代码单元,将 目标崩溃代码单元转化为其所对应各个预设特征指标的特征值组成的特征向量,获得各个 目标崩溃代码单元所分别对应的特征向量,构成目标预测集,并进入步骤007 ;
[0012] 步骤007.采用经过训练的分类器,针对目标预测集进行预测,预测各个目标崩溃 代码单元是否包含缺陷,分别确定各个目标崩溃栈数据中包含缺陷的各个最终目标崩溃代 码单元。
[0013] 作为本发明的一种优选技术方案:所述步骤007之后还包括如下步骤008 :
[0014] 步骤008.根据历史代码维修记录,针对各个最终目标崩溃代码单元进行评价。
[0015] 作为本发明的一种优选技术方案:所述步骤008具体包括如下步骤:
[0016] 步骤00801.针对各个最终目标崩溃代码单元,分别获得最终目标崩溃代码单元 的各个预设缺陷倾向指标的指标值X1,并进入步骤00802 ;其中,I<i<I,I为预设缺陷 倾向指标的个数;
[0017] 步骤00802.根据如下公式,针对各个最终目标崩溃代码单元,分别获得各个最终 目标崩溃代码单元的缺陷倾向评分Score,并进入步骤00803 ;
[0019] 步骤00803.根据各个最终目标崩溃代码单元的缺陷倾向评分Score,针对各个最 终目标崩溃代码单元进行排序。
[0020] 作为本发明的一种优选技术方案:所述预设缺陷倾向指标的个数I= 5,所述步骤 00701中,根据如下5个预设缺陷倾向指标,及其指标值^计算公式,针对各个最终目标崩 溃代码单元,分别获得最终目标崩溃代码单元的各个预设缺陷倾向指标的指标值X1;
[0022] X1表示反向调用距离缺陷倾向指标,用于衡量最终目标崩溃代码单元距离崩溃点 的调用距离;Frame表示最终目标崩溃代码单元位于对应目标崩溃栈数据的层数位置,其 中,崩溃点所处的层数为〇,若最终目标崩溃代码单元未出现在对应目标崩溃栈数据中时, 则Frame等于对应目标崩溃栈数据最大层数加I;Dise表示最终目标崩溃代码单元的调用 深度;
[0023] X2=log(L0C+l)
[0024] &表示最终目标崩溃代码单元单位长度缺陷倾向指标,用于衡量最终目标崩溃代 码单元的相对长度,LOC表示最终目标崩溃代码单元包含的代码行总数;
[0026] ^表示最终目标崩溃代码单元延续时间缺陷倾向指标,用于衡量最终目标崩溃代 码单元同最近一次修复或更新的时间距离;Day表示最终目标崩溃代码单元距离最近一次 修复或更新的天数;
[0028] X4表示最终目标崩溃代码单元缺陷比率倾向指标,用于衡量最终目标崩溃代码单 元在预设分类器中被预测包含缺陷的比率;N表示预设分类器中基分类器的数量#&^表 示预设分类器中预测最终目标崩溃代码单元包含缺陷的基分类器的数量;
[0030] 15表示最终目标崩溃代码单元历史缺陷比率倾向指标,用于衡量最终目标崩溃代 码单元在历史崩溃栈数据中被预测为包含缺陷的比率;No表示涉及到最终目标崩溃代码 单元的历史崩溃栈数据的个数;Nodrf^表示根据历史代码维修记录确定最终目标崩溃代码 单元包含缺陷的目标崩溃栈数据的数量。
[0031] 作为本发明的一种优选技术方案:所述预设分类器为AdaBoost分类器
[0032] 作为本发明的一种优选技术方案:所述步骤001中,分别针对各个历史崩溃栈数 据,执行如下步骤a01至步骤a03,获得各个历史崩溃栈数据分别所对应的各个历史崩溃代 码单元,构成所有历史崩溃栈数据所对应的历史崩溃代码单元集合;
[0033] 步骤aOl.应用调用链分析方法,针对历史崩溃栈数据中涉及到的代码单元进行 分析扩展,获得该历史崩溃栈数据所涉及到的全部代码单元,并构建与之相对应的静态调 用图,然后进入步骤a02;
[0034] 步骤a02.应用控制流分析方法,基于软件控制流顺序,删除静态调用图中软件执 行不可达的代码单元,并进入步骤a03 ;
[0035] 步骤a03.应用反向切片技术,基于软件控制流顺序,删除静态调用图中与该历史 崩溃栈数据中崩溃点变量引用无关的代码单元,最后,静态调用图中剩余的代码单元即为 该历史崩溃栈数据所对应的各个历史崩溃代码单元。
[0036] 作为本发明的一种优选技术方案:所述步骤005中,针对各个目标崩溃栈数据,分 别执行如下步骤b01至步骤b03,获得各个目标崩溃栈数据分别所对