一种基于问答网站分析的程序崩溃缺陷自动修复方法技术领域
本发明涉及计算机软件技术领域,尤其涉及一种基于问答网站分
析的程序崩溃缺陷自动修复方法。
背景技术
计算机系统在执行应用程序的进程的过程中,不可避免的会由
于该应用程序的进程自身的原因,比如除零错误、堆栈溢出、内存
越界或空指针等原因,导致在执行应用程序的进程时发生程序崩溃,
一旦程序发生崩溃,人们将无法继续使用该应用程序,给用户的工
作和生活带来诸多不便。因此,某一应用程序崩溃后的自我修复能
力对于该应用程序而言也是一个非常重要的因素。
目前,现有的程序崩溃缺陷相关的技术主要针对崩溃缺陷的定
位、恢复以及修复检查这几个方面,具体说明如下:第一方面:通
过堆栈信息定位到程序崩溃出错语句,但是这种方法仍然需要开发
人员通过理解代码人工写出修复补丁;第二方面:令应用程序从崩
溃状态恢复到可继续执行的状态,使程序继续运行,但这种方法并
未从根本上解决崩溃的修复问题,并且存在额外的运行开销;第三
方面:在开发人员修复崩溃缺陷后对程序崩溃的修复进行检查,自
动预测是否会有新的崩溃发生,然而这类方案并不涉及应用程序的
自动修复。
综上所述,现有技术中修复应用程序崩溃的方法仍然依赖开发
人员的操作,导致开发人员的工作量增加。
发明内容
本发明要解决的技术问题是:应用程序在发生崩溃时如何不依赖
人员操作自我修复的问题。
为实现上述的发明目的,本发明提供了一种基于问答网站分析的
程序崩溃缺陷自动修复方法,包括:
根据程序发生崩溃时生成的崩溃踪迹,获取多个相关网页;
其中,所述相关网页中包含描述所述崩溃的缺陷代码以及修复所
述崩溃的修复代码;
在每个所述相关网页中,提取所述缺陷代码的片段以及修复代码
的片段;根据所述缺陷代码片段以及修复代码片段生成用于修复所述
崩溃的编辑脚本;
根据所述崩溃踪迹以及缺陷代码,确定所述程序源代码中有错误
代码的位置,应用所述编辑脚本修复所述错误代码。
其中较优地,所述获取多个相关网页,是获取多个问答网站中的
相关网页。
其中较优地,
所述问答网站相关网页中的提问贴包含所述缺陷代码;
所述问答网站相关网页中的答案贴包含所述缺陷代码和修复代
码。
其中较优地,所述在每个所述相关网页中,提取所述缺陷代码的
片段以及修复代码的片段为:
在所述答案贴中提取缺陷代码片段以及修复代码片段。
其中较优地,所述在每个所述相关网页中,提取所述缺陷代码的
片段以及修复代码的片段为:
在所述提问帖中提取所述缺陷代码的片段;
在所述答案贴中提取所述修复代码片段。
其中较优地,所述根据所述缺陷代码片段以及修复代码片段生成
用于修复所述崩溃的编辑脚本,包括:
将所述缺陷代码的片段与修复代码片段组成代码片段对;
在所述代码片段对中,计算所述缺陷代码片段的语句相似度和修
复代码片段语句相似度,过滤掉相似度小于预设阈值的所述语句;
构建过滤后的所述代码片段对中所述缺陷代码的片段和修复代
码片段之间的映射,根据所述映射生成所述缺陷代码的片段和修复代
码片段之间的所述编辑脚本。
其中较优地,所述根据所述崩溃踪迹以及缺陷代码,确定所述程
序源代码中有错误代码的位置,应用所述编辑脚本修复所述错误代
码,具体包括:
提取所述崩溃踪迹中发生崩溃的文件的文件名,形成文件集合;
根据所述崩溃踪迹中包含的所述文件的行号,确定所述文件在源
代码中的位置,并提取所述文件的源代码片段;
计算所述源代码片段中语句的相似度,过滤所述相似度小于预设
阈值的所述源代码片段语句;
构建所述缺陷代码片段与所述程序源代码片段的映射关系;
将所述编辑脚本中所述缺陷代码片段的元素,按所述缺陷代码片
段与程序源代码片段的映射关系,替换为所述程序源代码中的相应元
素;
将编辑脚本中的所述替换的所述程序源代码元素,按所述缺陷代
码的片段和修复代码片段之间的映射关系,替换为相应的修复代码片
段中的元素,生成替换代码补丁;
将所述替换代码补丁带回所述程序源代码中。
其中较优地,所述缺陷代码片段以及修复代码片段为多个,相应
地,根据缺陷代码的片段和修复代码片段生成的替换代码补丁也为多
个。
其中较优地,还包括:
将多个所述替换代码补丁中相同的补丁合并;
过滤掉多个所述替换代码补丁中出现编译错误的补丁;
根据所述过滤后的替换代码补丁判断修复结果。
本发明提供了一种基于问答网站分析的程序崩溃缺陷自动修复
方法。该方法通过根据崩溃踪迹在问答网页上自动搜索修复方案,并
生成相应的编辑脚本对崩溃进行修复,摆脱了在修复过程中对操作人
员的依赖,实现自动修复,且修复精度较高。
本发明提供了一种基于问答网站分析的程序崩溃缺陷自动修复
方法。该方法通过根据崩溃踪迹在问答网页上自动搜索修复方案,并
生成相应的编辑脚本对崩溃进行修复,摆脱了在修复过程中对操作人
员的依赖,实现自动修复,且修复精度较高。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处
对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施
方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用
相同的参考符号表示相同的部件。在附图中:
图1是本发明第一实施例提供的基于问答网站分析的程序崩溃缺
陷自动修复方法流程图;
图2是本发明第一实施例提供的缺陷代码片段与修复代码片段映
射示意图;
图3是本发明第一实施例提供的缺陷代码片段与程序源代码片段
映射示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细
描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
如图1所示,本发明提供了一种基于问答网站分析的程序崩溃缺
陷自动修复方法。该方法具体包括:S101、根据程序发生崩溃时的崩
溃踪迹,获取多个相关网页;其中,相关网页中包含描述崩溃的缺陷
代码以及修复崩溃的修复代码;S102、在每个相关网页中,提取缺陷
代码的片段以及修复代码的片段;根据缺陷代码片段以及修复代码片
段生成用于修复崩溃的编辑脚本;S103、根据崩溃踪迹以及缺陷代码,
确定程序源代码中有错误代码的位置,应用编辑脚本修复错误代码。
优选地,还包括S104、判断修复结果。下面对本发明提供的基于问答
网站分析的程序崩溃缺陷自动修复方法展开详细的说明。
实施例一
本实施例提供了一种基于问答网站分析的程序崩溃缺陷自动修
复方法。下面将对该方法进行具体说明:
S101、根据程序发生崩溃时的崩溃踪迹,获取多个相关网页;
其中,所述相关网页中包含描述所述崩溃的缺陷代码以及修复所述
崩溃的修复代码。下面将对S101步骤中包含的子步骤进行展开说
明。
S1011、提取程序发生崩溃时生成的崩溃踪迹中的信息。
当一个程序崩溃时,会生成崩溃信息。发生崩溃的程序可以以
以下方式实现:
下段程序中的31行发生崩溃,其崩溃踪迹可以按以下方式实现:
其中,第1行和第13行是崩溃的描述信息。第2-12行、第14-18
行表示两个堆栈踪迹。提取上述崩溃踪迹的第一行,删除该行中所
有包含项目名的单词。
S1012、将提取的崩溃踪迹结果作为搜索请求,使用搜索引擎进
行搜索,优选地在问答网站中搜索,得到排好序的问答网页。其中,
根据S1011中的示例,搜索请求为:
java.lang.RuntimeException:Unabletostartreceiver
IntentReceivercomponentsarenotallowedtoregistertoreceiveintents
S102、在每个相关的问答网页中,提取描述崩溃缺陷情况的缺
陷代码的片段以及修复代码的片段;根据缺陷代码片段以及修复代
码片段生成用于修复崩溃的编辑脚本。下面将对S102步骤中包含的
子步骤进行展开说明。
S1021、按照问答网页的次序一次分析S101步骤得到的每个问
答网页。在每个网页中,使用HTMLParser(HTML解析和分析的
工具,包括信息提取和信息转换两大功能)把包含在<code></code>
标签中(HTML中的一种标签,标签中包含的为代码)的片段提取
出来。以这种方式提取出的基本都是代码片段。
在每个问答网页中包括提问贴和答案贴。其中,提问贴包含描述
崩溃缺陷情况的缺陷代码;答案贴包含缺陷代码和修复相应崩溃缺陷
的修复代码。
例如,提问贴可以按以下方式实现:
答案贴可以按以下方式实现:
在提问贴和答案贴中提取缺陷代码的片段以及修复代码的片段
为,具体包括两种提取方式:
第一种方式:将答案贴中的不同代码片段按照关键字“BInstead
ofA”或者“ChangeAtoB”筛选出来,并组合成缺陷-修复代码对A-B。
其中A为缺陷代码片段,B为修复代码片段。
从答案贴中提取的缺陷-修复代码对的数量为多个,从上述答案
贴中提取出的多个代码对的其中一个可以按以下方式实现:
c o n t e x t . r e g i s t e r Re c e i v e r ( ... ) ; c o n t e x t . g e t A p p l i c a t i o n C o n t e x t ( ) . r e g i s t e r Re c e i v e r ( ... ) ; ]]>
其中,上方为缺陷代码片段A,下方为修复代码片段B。
第二种方式:按同样的提取方式提取问题贴中的多个缺陷代码
片段A和以及答案贴中的多个修复代码片段B,分别组成缺陷-修复
代码对A-B。
同样地,从问题贴以及答案贴中提取的缺陷-修复代码对的数量
为多个,从上述问题贴以及答案贴中提取出的多个代码对的其中两
个可以按以下方式实现:
I n t e n t int e n t = c o n t e x t . r e g i s t e r Re c e i v e r ( ... ) ; c o n t e x t . r e g i s t e r Re c e i v e r ( ... ) ; ]]>
I n t e n t int e n t = c o n t e x t . r e g i s t e r Re c e i v e r ( ... ) ; c o n t e x t . g e t A p p l i c a t i o n C o n t e x t ( ) . r e g i s t e r Re c e i v e r ( ... ) ; ]]>
其中,每个片段对的上方为缺陷代码片段A,下方为修复代码
片段B。
S1022、精简每个代码片段对。计算缺陷代码片段A中语句的
相似度和修复代码片段B中语句的相似度,过滤掉相似度小于预设
阈值的所述语句相似度。语句相似度的计算公式如式(1)、(2)所示:
S i m ( T e x t ) = 1 - e d i t d i s tan c e l e n _ b u g g y * l e n _ f i x e d - - - ( 1 ) ]]>
S i m ( S t r u c t u r e ) = n u m _ c o m m o n n u m - t o t a l - - - ( 2 ) ]]>
其中,edit_distance表示两条语句之间的编辑距离。len_buggy
表示缺陷代码的字符串长度,len_fixed表示修复代码的字符串长度,
num_common表示AST的相同叶子结点的个数,num_total表示AST
中所有叶子结点的个数。
过滤掉缺陷代码片段A中和修复代码片段B中语句相似度均于
预设阈值的语句。其中,预设阈值为Sim(Text)=0.8,
Sim(Structure)=0.3。
S1023、使用GumTree方法构建代码对中的缺陷代码片段A和
修复代码片段B之间的映射,用代码片段对应的抽象语法树(AST)
之间的映射表示。如图2所示,缺陷代码片段A为21范围内的代码
片段,修复代码片段B为22范围内的代码片段。可以看出,21范
围内的代码片段与22范围内的代码片段中的类一一映射。
进而利用GumTree方法根据该映射生成两个代码片段之间的编
辑脚本。编辑脚本用于描述如何将缺陷代码片段转变为修复代码片
段的一系列动作。GumTree的编辑脚本中包括4个动作:添加、删
除、更新和移动。此外,在GumTree的算法中新添加两个动作:替
换和复制。替换用于把缺陷代码片段的抽象语法树AST(Abstract
SyntaxTree,AST)和修复代码片段的AST中不同类型的结点替换,
复制用于把缺陷代码片段的AST中的结点复制到该AST新的位置
上。
S103、根据崩溃踪迹以及缺陷代码,确定程序源代码中有错误
代码的位置,应用编辑脚本修复错误代码。下面将对S103步骤中包
含的子步骤进行展开说明。
S1031、崩溃踪迹包含崩溃文件的文件名,把崩溃文件的文件名
提取出来,作为待考虑的文件集合。
S1032、崩溃踪迹中还包含行号,根据所述崩溃踪迹中包含的崩
溃文件的行号,确定崩溃文件在源代码中的位置,并提取崩溃文件的
源代码片段。
S1033、在待考虑的文件集合中,使用式(1)、(2)过滤掉集合中
文件里相似度低于阈值的语句。然后再次使用GumTree方法建立问
答网页中的缺陷代码片段与程序源代码之间的映射。如图3所示,
缺陷代码片段A为31范围内的代码片段,程序源代码片段为32范
围内的代码片段。可以看出,31范围内的代码片段与32范围内的代
码片段中的某一类互相映射。
把S102步骤的编辑脚本中的缺陷代码片段中的元素按该映射关
系替换为源代码片段中的元素,然后应用编辑脚本,将编辑脚本中的
所述替换的所述程序源代码元素,按如图2所示缺陷代码的片段和修
复代码片段之间的映射关系,替换为相应的修复代码片段中的元素,
生成替换代码补丁。最终的替换补丁可以为以下形式:
finalfloatbl=BatteryHelper.level(
context.getApplicationContext());
由于提取的缺陷-修复代码对为多个,因此本步骤中生产的替换
代码补丁也为多个。
S1034、把多个替换代码补丁应用回程序源代码中。
S104、代码补丁过滤判断修复结果。
在本步骤中,合并相同的替换代码补丁,并过滤掉出现编译错
误的补丁。最后将剩余的代码补丁按照顺序报告给开发人员。开发
人员将通过人工观察判断第一个补丁的正确性。
实施例二
为了检验本发明的修复效果,优选地,选用GitHub(一个分布
式的版本控制系统)上的安卓程序集,应用实施例一提供的基于问
答网站分析的程序崩溃缺陷自动修复方法对安卓程序集的程序崩溃
进行修复。GitHub上的实验程序集信息如表1所示,修复产生的补
丁个数和正确性如表2所示,修复所花费的修复时间如表3所示。
表1GitHub上的实验程序集
表2修复产生的补丁及正确性
表3修复时间
其中,表1统计了GitHub上选取的程序集信息,程序大小从几
百行到几万行不等。“错误报告编号”为该崩溃缺陷在GitHub上的来
源。
表2给出方法的修复效果,包括修复产生的替换代码补丁数量
以及第一个替换代码补丁修复的正确性。“产生的修复补丁个数”表
示本工具在对应的崩溃缺陷上产生的补丁的个数,为经过过滤编译
筛选后所剩余的补丁。“第一个补丁的正确性”通过人工观察所产生
的第一个补丁的正确性,与GitHub对应错误报告的人工修复的补丁
进行对比,判断第一个补丁是否正确。正确用“Y”表示,错误用“N”
表示。
表3统计了应用本发明实施例一提供的方法修复GitHub上选取
的程序集信息所消耗的修复时间。运行结果说明,本发明提供的能
基于问答网站分析的程序崩溃缺陷自动修复方法能够高效修复相当
数量的崩溃缺陷,精度较为理想。
综上所述,本发明提供了一种基于问答网站分析的程序崩溃缺
陷自动修复方法。该方法通过根据崩溃踪迹在问答网页上自动搜索
修复方案,并生成相应的编辑脚本对崩溃进行修复,摆脱了在修复
过程中对操作人员的依赖,实现自动修复,且修复精度较高。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关
技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,
还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明
的范畴,本发明的专利保护范围应由权利要求限定。