前言
最近正在学习软件修复技术,当然此类工具很多包括Simfix、CapGen等。我选择Simfix在本地实际测试了一遍,虽然配置相对比较繁琐(需要先配置defects4j程序集环境),但是学习总会使我们快乐嘛。这也是我的第一篇博客,以后与大家一起交流、共勉学习。好,开始我们的干货!
1.配置准备
defects4j程序集的需求环境很麻烦,不过作为新人的我肯定会详细的给大家讲解了。
关于JDK的版本,小编在此提醒各位,务必使用jdk1.7!!!(很重要),其他的版本会出某些小问题,到时候费力不讨好。
2.环境安装
1)JDK1.7的配置
由于关于需要配置JDK环境的软件对于JDK最低版本变为1.8。jdk1.7官网下载需要注册Oracle账号,在此我已保存在网盘,直接下载即可。
链接:https://pan.baidu.com/s/1QOHw9tm8ePRaza_w1gCs6A 提取码:572t
由于各位大牛们可以操作关于自动修复的技术,相信关于JDK在Ubuntu环境下的配置不用再赘述了,可以参考
https://blog.youkuaiyun.com/rflyee/article/details/8989663
2)Git的配置
打开终端,输入以下命令即可:
sudo apt-get update
sudo apt-get install git
git --version
3)SVN的配置
sudo apt-get subversion
svn --version
4)Perl的配置
可先在 http://www.cpan.org/src/5.0 上查找对应的版本 ,以perl-5.26.1.tar.gz为例
在终端依次运行以下命令
sudo wget http://www.cpan.org/src/5.0/perl-5.26.1.tar.gz
tar -xzf perl-5.26.1.tar.gz
cd perl-5.26.1
./Configure -des -Dprefix=$HOME/localperl
make
make test
make install
等几分钟perl就安装好了
3.defects4j的安装
1) Clone Defects4J:
git clone https://github.com/rjust/defects4j
下载下来以后在电脑的主目录。(E:/home/lizeyu)
2)初始化Defects4J
cd defects4j
./init.sh
3) 将Defects4J的可执行文件添加到路径中:
sudo gedit /etc/profile
export PATH=$PATH:/home/lizeyu/defects4j-master/framework/bin
export DEFECTS4J_HOME=/home/lizeyu/defects4j-master
具体操作与Java配置时一样。
4)检查安装:
defects4j info -p Lang
5)使用defects4j:
Example commands
1. 获取特定项目的信息(commons lang)
- `defects4j info -p Lang`
2. 获取特定bug的信息(commons lang, bug 1)
- `defects4j info -p Lang -b 1`
3.检出有bug的源代码版本(common lang, bug 1, bug版本)
- `defects4j checkout -p Lang -v 1b -w /tmp/lang_1_buggy`
4. 更改到工作目录,编译源代码和测试,并运行测试
- `cd /tmp/lang_1_buggy`
- `defects4j compile`
- `defects4j test`
如果在测试过程中出现
Can't locate DBI.pm in @INC (you may need to install the DBI module) (@INC contains: )
错误,不要惊慌,作者遇到过,肯定不会在自己的第一篇博客中忘记告诉大家解决办法
输入命令:
sudo apt-get install libdbi-perl
4.Simfix的使用
是不是很繁琐啊,来到这我们已经快要成功了,接下来终于到了紧张又刺激的时刻,我有点小激动,不知道看着心累的大牛们内心是否泛起波澜,想给小弟一些鼓励呢。
关于Simfix的下载,相信来到这里的大牛们知道SIR。小弟送上本人测试所用的Simfix,下载后解压即可。
链接:https://pan.baidu.com/s/1BuKarFksXDQx0aYRfrGQYA
提取码:0g57
下载后大家可以阅读Readme文件了解详细的介绍,小弟在此只叙述一下使用方法。
Simfix有两种运行方式,因为Simfix本身就是eclipse制作的工程文件。所以有强迫症喜欢把大件程序代码放到eclipse上的牛牛们有福了(本人就是,主要是觉得成就感满满,各类文件显示都很到位,对于工具的重做与修订很有感觉),当然是一个工程文件自然有jar包了,最熟悉的终端命令行运行也是可以的。
首先讲解一下Simfix的准备工作
在运行之前
*`unzip(解压)`文件`sbfl / data.zip`到`sbfl / data`:用于故障定位(谨记!谨记!谨记!)
*使用Defects4J提供的命令行检查一个错误版本的基准测试。(在此之前请创建 目录:/home/lizeyu(个人ubuntu系统用户名)/d4j/lang(包括chart、time等),小编在之后不再赘述。
`示例:defects4j checkout -p Lang -v 1b -w /home/lizeyu/d4j/lang/lang_1_buggy`
** _注意_ **:基准版错误版本的路径必须设置为:
`... / projectName / projectName_id_buggy` =>`示例:/home/lizeyu/d4j/lang/lang_1_buggy`
运行选项
我们的* SimFix *原型需要**三个**输入选项才能运行。
*`--proj_home`:基准测试程序的家。 (例如``$ {/home/lizeyu/d4j}`
*`--proj_name`:基准测试程序的项目名称。 (示例中的`lang`)
*`--bug_id`:有缺陷的程序的标识符。 (示例为“1”)
*`--bugy_id`选项支持多种格式:
`single_id`:修复单个bug,例如1`。
`startId-endId`:修复一系列带有连续标识符的错误,例如1-3。
`single_id,single_id,single_id`:修复特定程序的任何错误,例如,1,5,9`。
`all`:修复特定项目的所有错误版本,即`all`。
示例: --proj_home=/home/lizeyu/d4j --proj_name=lang --bug_id=1
另一个:--proj_home=/home/lizeyu/d4j --proj_name=lang --bug_id=1,4,8
不同方式运行
方式一:在eclipse上运行
我在使用时遇到两个问题,第一个呢,就是我之前在文中提到的eclipse目前最低要求jdk版本为1.8.所以会出现配置好jdk1.7以后eclipse打开报错。类似说明检测到本地安装的是java 1.7,但软件运行需要至少java1.8(当然旧版本eclipse不会遇到)。很尴尬是不是。不好意思,写到这里相信大家跟我一样入坑了。小弟冥思苦想想到以前刚用eclipse使用1.7后来更换1.8的方法奏效了(也就是本地两个jdk版本)。首先将PATH变量更改为Java 1.8的路径。当我打开eclipse后,高兴的要导入之前移到workspace的Simfix-master的工程包时第二个问题来了,导入不进去,不知道你们有没有,当然这是后话。打开eclipse,随便建一个java project,例如:simfix,建好后将之前的Simfix-master目录下的文件复制到刚建好的在eclipse的workspace目录simfix文件下,遇到文件冲突点替换就好。然后返回eclipse刷新一下就好了,那第一个问题需要jdk1.7自然就是很简单了,右击simfix工程‘build-path’,接下来就不说了。一切OK。不知道是不是话痨上身,废话一阵子。
正题来了:主文件是src.cofix.main.Main,很意外居然跟普通java文件运行一样,就是这么的优秀。然后惊喜的发现一脸懵逼,运行需要的三个选项还没填,而且不知道在哪儿填。嘿嘿,右击Main.java文件:
`Run As`→`Run Configurations…` →`Arguments` : 在第一栏输入之前讲解的规范输入,Run即可。
.
方式二:终端运行
此方式需要使用已经打包好的simfix.jar文件,在Simfix文件目录的final目录下。将jar包移到主目录(Simfix-master目录下)。
将终端路径cd到Simfix-master目录下
java -jar simfix.jar --proj_home=/home/lizeyu/d4j --proj_name=lang --bug_id=1
结果分析
运行结束后会出现两个文件夹,两种方式都在simfix的home路径下。只有修复成功才会出现patch目录。
*`log`:调试输出,包括已经尝试的错误语句,补丁和参考代码片段,用于正确的补丁生成。
*`patch`:由* SimFix *修复的单个源文件,可以通过测试套件。 在源文件中,您可以找到格式为(Lang_1示例)的修补程序。
5.结尾总结
本人也是一位新人,这也是本人第一篇博客,叙述不够清楚望海涵。在使用过程中遇到问题可以留言或者联系我,我定力所能及的及时帮助,大家共同学习、共同进步。码了这马多,真的是比敲代码还累。希望点个赞、点个关注支持一下。