JavaSlicer -- Open source Dynamic Slicing Tool(开源代码的动态切片工具)
by Clemens Hammacher(克莱门斯·哈马赫尔) at Saarland University(德国萨尔州立大学)
翻译:yongfeng
github网址:
https://github.com/hammacher/javaslicer
时间:5/14/2016
==============================
工具简介 JavaSlicer
JavaSlicer 是一个开源的动态切片工具,由德国萨尔州立大学开发
JavaSlicer 能够输出 Java 程序的执行路径,然后线下的计算动态切片,由一下5个模型构成:
* Tracer:
这是一个java agent,能够产生java程序执行的路径文件tracefile。这个路径文件是字节码,包含了有加载的类以及每个线程的执行路径
* TraceReader:
包含所有需要打开的类,并处理路径文件tracefile,提供向前和向后的迭代器
* Core:
这是切片组件的核心部分,它用 TraceReader 来处理路径文件,然后计算出执行过程中所有的动态依赖
* Common:
包含其他组件所使用的类
* Jung:
这个组件依需求而创建,他会创建一个动态依赖的 JUNG 图,也可以将它可视化。不幸的是,这只对那些很小很简单的图有效
==============================
一. 安装 Installation
JavaSlicer 需要你的机器上安装以下2个软件:
* JDK 1.6 或者 1.7
JDK 1.8 引入了一些新语言特征,而这些特征 JavaSlicer 无法处理
* Apache Maven
安装maven版本最好在 2.2.X 以上
为了编译所有的JavaSlicer组件,请简单的运行一下配置脚本(assemble script):
> cd javaslicer
> ./assemble.sh
运行assemble.sh语句将会创建出一个配置目录,这样可以把可运行的jar包拷贝进来
> ls -lh assembly
如果上一步运行shell脚本成功,文件夹中就会显示 slicer.jar traceReader.jar tracer.jar visualize.jar
如果你打算修改 JavaSlicer 源码,你可以使用 Maven 来创建一个相关eclipse项目:
> mvn eclipse:eclipse
在此之后,就可以把导入以创建的项目了
如果你在 eclipse 中安装了 Maven 插件,你可以直接导入 Maven 项目,而不用打入命令行语句 “ mvn eclipse:eclipse ” 了
==============================
二. 限制 Limitations
现在的 JavaSlicer 依然有一些限制,他们中有些可能在后续版本中加以改正,包括:
* 本地方法追踪
* 不能追踪某些标准化库类的追踪,如 java.lang.String,java.lang.System,java.lang.Object等
* 多线程应用的追踪,此阶段,每个线程都是独立追踪的,即不同线程间的数据依赖无法建立
==============================
三. 使用 Usage
这一部分简单的描述一下如何使用JavaSlicer的命令行工具,假设你已经有由Maven创建的配置jar文件,也就是下面4个jar包。
slicer.jar traceReader.jar tracer.jar visualize.jar
使用 trace.jar 包来创建一个java程序运行路径。为了获取让所有的debug信息,你应该编译你的程序使用 -g 标记
JavaSlicer已经在 Java1.6 版本的编译器上开发和测试过了,任何 OpenJDK 都可以兼容,其他编译器可能会产生不被支持的字节码序列
你可以得到一个java agent 所有选项的列表,即通常的帮助help选项
> java -javaagent:assembly/tracer.jar=help
创建一个路径文件将javaagent 附带在java 进程中,你是否执行一个jar包对此都无任何影响,比如这样你就可以创建出一个test.trace的路径文件了:
> java -javaagent:assembly/tracer.jar=tracefile:test.trace -jar evaluation/dacapo-2006-10-MR2.jar
或者你的 CLassPath 路径上的其他任何类文件
> java -javaagent:... -cp bin/classes:resources my.package.ClassName
你也可以跟踪 Junit 中的测试
> java -javaagent:... org.junit.runner.JUnitCore
如果你想要的话,然后你就可以看到完成路径(警告,这个信息将会非常大,整个控制台会一直刷个不停)
> java -jar assembly/traceReader.jar test.trace
对于traceReader的输出结果来说,以下是所提供的帮助
> java -jar assembly/traceReader.jar -h
或者,你可以在下面运行动态切片器,这时候,你需要给 JVM 更多的内存,以下示例分配2g内存
> java -Xmx2g -jar assembly/slicer.jar -p test.trace java.util.HashMap.clear:614
下面这个切片器返回给你可用全部选项的总和
> java -jar assembly/slicer.jar
==============================
四. 定义切片标准 Defining The Slicing Criterion
确定切片准则对于使用JavaSlicer工具至关重要,这里有3个选项:
a. java.util.HashMap.clear: 614
切片会包含指定行数的指令(如614行),和那些导致指定的行数的指令的执行的指令。
b. java.util.HashMap.clear: 614 :{tab,modCount}
这些切片包含影响到方法java.util.HashMap.clear的614行的局部变量“tab”和“modCount”的所有指令
注意:局部变量不需要在这一行出现,你可以省略行号,然后你就会切到方法中该变量的最后一个值
在这个模式下,如果他们产生的值被该行的其他任何指令使用,那么那一行的指令会添加到切片中,
c. java.util.HashMap.clear:614: *
这个切片会切指定行的所有数据和执行
从特定的指令开始,这个切片会在所有的控制和数据依赖传递闭包