Java程序分析平台Jchord简介
Jchord是一个独立的java程序分析平台,它为用户提供众多标准分析,包括线程逃逸分析,静态切片分析,死锁分析,数据竞争分析等;同时,它允许用户编写和运行自己的分析。有关Jchord的资料可以从http://code.google.com/p/jchord/下载。
Jchord包括binary版和source版,本文的介绍基于source版本。
- 下载source版
从上述地址下载source版本的Jchord,得到名为chord-src-2.0.tar.gz的压缩文件,解压到指定目录。
- 编译source版
source版的编译需要如下软件:
1.java5或更高版本的JVM;
2.Apache Ant,一个java生产工具。
Ant的配置可参考http://blog.csdn.net/huanghm88/article/details/3965218。JVM和Ant安装完成后,开始编译Jchord。
在Jchord的主目录下包括一个build.xml文件,它可以被Apache Ant解释执行,要编译Jchord运行如下命令:ant compile。它可以从src/文件夹中编译java源文件生成java字节码文件,放到新生成的classes/文件夹中;同时,从lib/库文件中生成chord.jar文件。
- 运行Jchord
编译完成source之后,下面开始运行Jchord。
Jchord的分析基于java字节码程序,用户通过定义系统属性来指定Jchord将要完成的功能。其命令行格式如下:
ant -D<key1>=<val1> ... -D<keyN>=<valN> run
其中,keyi为指定的系统属性,vali为系统属性值。除上述定义系统属性的方法外,还可以将常用的系统属性写入到chord.properties文件中。chord.properties文件存在于每个需要被分析的java程序中,Jchord执行之前将首先载入此文件中的所有系统属性,具体可参见examples文件夹下的几个例子。
下面讲解几个常用的系统属性:
1.chord.work.dir Jchord运行时的工作目录,默认为当前目录;
2.chord.props.file chord.properties文件路径,默认为[chord.work.dir]/chord.properties;
3.chord.src.path java源程序路径;
4.chord.class.path java字节码文件路径;
5.chord.main.class java程序主类名;
6.chord.max.heap Jchord运行时使用的最大堆栈空间,默认值为1024m,运行时应自行改小。
接下来以source版本中自带的死锁程序为例讲解如何运行Jchord。
在Jchord主目录下进入examples/deadlock-test文件夹,运行如下命令:ant。若成功运行将产生classes文件夹,同时命令行中生成如下内容:
Buildfile: c:\examples\deadlock_test\build.xml
compile:
[mkdir] Created dir: c:\examples\deadlock_test\classes
[javac] Compiling 1 source file to c:\examples\deadlock_test\classes
BUILD SUCCESSFUL
Total time: 3 seconds
然后运行如下命令:ant -Dchord.work.dir=examples/deadlock_test -Dchord.run.analyses=deadlock-java run。成功运行将在命令行中生成如下内容:
Buildfile: c:\build.xml
run:
[java] Chord run initiated at: 2011-11-23 22:08:26
[java] ENTER: deadlock-java at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: L at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: M at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: RTA
[java] Iteration: 0
[java] Iteration: 1
[java] Iteration: 2
[java] Iteration: 3
[java] Iteration: 4
[java] LEAVE: RTA
[java] Time: 00:00:17:209 hh:mm:ss:ms
[java] SAVING dom M size: 5799
[java] LEAVE: M
[java] Exclusive time: 00:00:17:480 hh:mm:ss:ms
[java] Inclusive time: 00:00:17:480 hh:mm:ss:ms
[java] SAVING dom L size: 288
[java] LEAVE: L
[java] Exclusive time: 00:00:00:068 hh:mm:ss:ms
[java] Inclusive time: 00:00:17:548 hh:mm:ss:ms
……
BUILD SUCCESSFUL
Total time: 40 seconds
同时,在工作目录中生成chord_output文件夹,Jchord分析结果保存在HTML文件中。结果截图如下:
至此,就介绍完了Jchord的基本用法,有关Jchord的更深层次的内容笔者正在研究中。
PS:
事实上,笔者并未真正得到上面的HTML文件(上图是在谷歌代码中截取的),在运行Jchord的最后一步产生了莫名其妙的问题,命令行中输出了如下内容:
Buildfile: c:\build.xml
run:
[java] Chord run initiated at: 2011-11-23 22:08:26
[java] ENTER: deadlock-java at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: L at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: M at Wed Nov 23 22:08:29 CST 2011
[java] ENTER: RTA
[java] Iteration: 0
[java] Iteration: 1
[java] Iteration: 2
[java] Iteration: 3
[java] Iteration: 4
[java] LEAVE: RTA
[java] Time: 00:00:17:209 hh:mm:ss:ms
[java] SAVING dom M size: 5799
[java] LEAVE: M
[java] Exclusive time: 00:00:17:480 hh:mm:ss:ms
[java] Inclusive time: 00:00:17:480 hh:mm:ss:ms
……
[java] ENTER: MputStatFldInst at Wed Nov 23 22:09:06 CST 2011
[java] SAVING rel MputStatFldInst size: 967
[java] LEAVE: MputStatFldInst
[java] Exclusive time: 00:00:00:214 hh:mm:ss:ms
[java] Inclusive time: 00:00:00:214 hh:mm:ss:ms
[java] ENTER: statIM at Wed Nov 23 22:09:06 CST 2011
[java] SAVING rel statIM size: 3452
[java] LEAVE: statIM
[java] Exclusive time: 00:00:00:241 hh:mm:ss:ms
[java] Inclusive time: 00:00:00:241 hh:mm:ss:ms
[java] Starting command: 'nice -n10 java -ea -Xmx1024m -cp E:\chord-src-2.0
\chord.jar -Dverbose=1 -Dbdd=j -Dbasedir=E:\chord-src-2.0\examples\deadlock_test
\chord_output\bddbddb net.sf.bddbddb.Solver E:\chord-src-2.0\examples\deadlock_t
est\chord_output\chord_analyses_alias_cipa_0cfa.dlog '
[java] Command 'nice -n10 java -ea -Xmx1024m -cp E:\chord-src-2.0\chord.jar
-Dverbose=1 -Dbdd=j -Dbasedir=E:\chord-src-2.0\examples\deadlock_test\chord_out
put\bddbddb net.sf.bddbddb.Solver E:\chord-src-2.0\examples\deadlock_test\chord_
output\chord_analyses_alias_cipa_0cfa.dlog ' terminated abnormally: Cannot run p
rogram "nice": CreateProcess error=2, ?????????
BUILD SUCCESSFUL
Total time: 40 seconds
上面高亮部分‘nice -n10’是不应该出现的。如有读者遇到同样问题或知道出现异常原因,可留言讨论。