JavaSlicer(github翻译)_追逐梦想的顾咏丰_新浪博客

JavaSlicer -- Open source Dynamic Slicing Tool(开源代码的动态切片工具)

by Clemens Hammacher(克莱门斯·哈马赫尔) at Saarland University(德国萨尔州立大学)

翻译:yongfeng



时间: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: *

这个切片会切指定行的所有数据和执行

从特定的指令开始,这个切片会在所有的控制和数据依赖传递闭包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值