运行动态切片的工具有Javaslicer,但是JavaSlicer也存在一系列问题,适应的jdk版本较低,无法处理多线程的数据。于是英属哥伦比亚大学的学者Khaled Ahmed提出了一种新的动态切片工具slicer4j。Slicer4J使用低开销的工具收集运行时执行跟踪;然后,它构造一个线程感知的、过程间动态控制流图,并使用该图来计算切片。
项目源码slicer4j
slicer4j安装
环境准备
python3 需要准备python3.8及以上,因为slicer4j中使用的python脚本低版本的python不支持。
sudo apt-get update
sudo apt-get install python3.9
jdk9及以上,slicer4j需要jdk9,但是defects4j项目在jdk9下运行时会出错,所以尽量还是把jdk8一块装上。
mvn3.9
building the tool
建立并且安装动态切片核心,从网址下载DynamicSlicingCore
cd core/
mvn -Dmaven.test.skip=true clean install
cd -
建立slicer4j,下载slicer4j
cd Slicer4J/
mvn -Dmaven.test.skip=true clean install
cd -
这里有个坑,如果使用这种方式建造,在使用slicer4j.py运行SlicerMe这个小测试项目的时候,生成不了东西,后来打包方式改变了,可以运行slicerMe了。可能的解决方法
mvn -Dmaven.test.skip=true clean compile assembly:single install
slicer4j介绍
主要有上图这几个文件夹,其中我理解的Slicer4j这个文件夹里面就是这个工具本身,毕竟进去把slicer4j工具编译安装了,scripts中提供了一些脚本,方便使用。benchmarks里面有一些项目,slicer4j,javaslicer和defects4j的,是基准测试集,用来比较和javaslicer的性能以及进行slicer4j使用体验的。
slicer4j使用
官网上的使用Java进行的命令行代码我一直没用成功使用,老是出现java.lang.NoClassDefFoundError:soot/type ,有朋友搞出来了可以在评论区告诉我一声。
java -cp "Slicer4J/target/slicer4j-jar-with-dependencies.jar:Slicer4J/target/lib/*" ca.ubc.ece.resess.slicer.dynamic.slicer4j.Slicer -h
但是运行scripts里面的脚本能运行起来
python3 slicer4j.py -h
这两行代码都是列出slicer的参数。
将slicer4j应用在实际项目上
进入benchmarks/SliceMe找到SliceMe项目,
mvn clean package
将项目打包,按照官网上在target目录下运行 java -jar sliceme-1.0.0.jar SlicerMe会报错
需要修改jar包中的manifest.mf文件
这个项目就是不传入参数时会报错,这时候再使用scripts,py
cd scripts
python3 slicer4j.py -j ../benchmarks/SliceMe/target/sliceme-1.0.0.jar -o sliceme_slice/ -b SliceMe:9 -m "SliceMe"
就能成功在scripts下的sliceme_slice文件夹下查看所有的切片信息了
这个项目目前bug还是挺多。