准备工作
- Linux版本:Ubuntu18.04lts
- Daikon版本:5.8.6
- JDK版本:1.8.0
- 链接1:ubuntu-18.04.4-desktop-amd64下载 提取码:62th
- 链接2:Daikon-5.8.6下载 提取码:zbbv
-
链接3:jdk-8u221-linux-x64下载 提取码:1df3
安装过程
安装JDK
- 在/usr/lib下新建文件夹jvm,并将jdk-8u221-linux-x64文件夹中jdk1.8.0_221文件夹复制到jvm文件夹下,如下图:
- 配置环境变量
vi编辑etc/profile文件,添加如下三行内容,并source保存。
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
root@ubuntu:/# vi etc/profile //vi编译
root@ubuntu:/# source etc/profile //source保存
- 测试jdk是否安装成功
root@ubuntu:/# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
安装Daikon
- 在usr下新建文件夹daikonparent,将daikon-5.8.6文件夹复制到daikonparent文件夹中
- 配置环境变量
export DAIKONDIR=/usr/daikonparent/daikon-5.8.6
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH::$DAIKONDIR/daikon.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
source $DAIKONDIR/scripts/daikon.bashrc
保存环境变量并使其生效
root@ubuntu:/#source /etc/profile
- 编译Daikon
root@ubuntu:/# make -C $DAIKONDIR rebuild-everything
编译Daikon时会 出现很多错误,比如:XXXX not found,百度下载即可,下载后再次编译(我是把所有not found的错误都解决了),还是报错的话可以先不管,这些错误可能对Daikon使用没有影响,比如,我编译后结果如下:
至此,可以用Daikon来生成Java语言编写的可执行程序,若想编译C/C++语言编写的可执行程序,则需继续下面的步骤
安装组件kvasir
- 下载fjalar
root@ubuntu:/usr/daikonparent/daikon-5.8.6# rm -r fjalar
root@ubuntu:/usr/daikonparent/daikon-5.8.6# git clone https://github.com/codespecs/fjalar.git
daikon 文件夹里自己有一个fjalar,需要删除后重新下载新的并覆盖;fjalar安装过程可能需要比较长的时间,也可能因为网络问题出错,耐心多试几次。
- 编译kvasir
root@ubuntu:/usr/daikonparent/daikon-5.8.6# make kvasir
kvasir的安装也会遇到XXXX not found等问题,根据提示安装即可。最终编译结果如下:
- 安装扩展组件——DynComp
安装时可能会出现“dcomp_rt.jar” is up to date的问题,如下,
切换到java目录下,将原来的dcomp_rt.jar删除后重新编译即可,结果如下。
测试Daikon
这里测试Daikon自带的测试用例。
- 测试Java可执行程序
root@ubuntu:/usr/daikonparent/daikon-5.8.6# cd examples/java-examples/QueueAr
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/java-examples/QueueAr# javac -g DataStructures/QueueArTester.java
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/java-examples/QueueAr# java -cp .:$DAIKONDIR/daikon.jar daikon.DynComp DataStructures.QueueArTester
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/java-examples/QueueAr# java -cp .:$DAIKONDIR/daikon.jar daikon.Chicory --daikon --comparability-file=QueueArTester.decls-DynComp DataStructures.QueueArTester
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/java-examples/QueueAr# java -cp .:$DAIKONDIR/daikon.jar daikon.Chicory --comparability-file=QueueArTester.decls-DynComp DataStructures.QueueArTester
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/java-examples/QueueAr# java -cp $DAIKONDIR/daikon.jar daikon.Daikon QueueArTester.dtrace.gz
最终生成dtrace.gz文件
- 测试C语言可执行程序
root@ubuntu:/usr/daikonparent/daikon-5.8.6# cd $DAIKONDIR/examples/c-examples/wordplay
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# gcc -gdwarf-2 -no-pie wordplay.c -o wordplay
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# kvasir-dtrace ./wordplay -f words.txt 'Daikon Dynamic Invariant Detector'
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# java -cp $DAIKONDIR/daikon.jar daikon.Daikon --config_option daikon.derive.Derivation.disable_derived_variables=true daikon-output/wordplay.decls daikon-output/wordplay.dtrace
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# kvasir-dtrace --dtrace-file=daikon-output/wordplay1.dtrace ./wordplay -f words.txt 'daikon dynamic invariant detector'
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# kvasir-dtrace --no-dyncomp --dtrace-file=daikon-output/wordplay2.dtrace ./wordplay -f words.txt 'better results from multiple runs'
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# kvasir-dtrace --no-dyncomp --dtrace-file=daikon-output/wordplay3.dtrace ./wordplay -f words.txt 'more testing equals better testing'
root@ubuntu:/usr/daikonparent/daikon-5.8.6/examples/c-examples/wordplay# java -Xmx256m daikon.Daikon daikon-output/wordplay*.dtrace daikon-output/wordplay.decls
最终生成wordplay.dtrace、wordplay1.dtrace 、wordplay2.dtrace、 wordplay3.dtrace 、wordplay-all.dtrace 文件