使用soot生成控制流图(Windows环境)

环境准备

  • OS: Windows 10
  • JDK: 1.8.0_191
  • soot: 3.0.1

步骤

下载Soot

Soot的版本要刚刚好(3.0.1)。如果版本过低不支持JDK1.8,过高会提示某些库找不到。

下载jar包最好下载***-jar-with-dependencies.jar,参考下载地址:链接

手动编译java源文件

Soot既可以读取*.java,也可以读取编译好的*.class。我选择先手动将java源文件编译成class文件,因为这样可以准确地暴露出代码中的错误。手动编译使用命令:

1
javac ***.java

注意最好不要直接将原工程目录下编译好的class文件直接拿来用,这样可能会出现其他问题,比如由于包名不正确导致找不到类等等。

使用CFGViewer生成流程图描述文件

1
java -cp sootclasses-trunk-jar-with-dependencies.jar soot.tools.CFGViewer --soot-classpath .;"<path-to-jdk>\jre\lib\rt.jar" --graph=BriefBlockGraph <ClassName>

其中--graph=BriefBlockGraph会使顺序执行的指令聚合在一起,看起来更加清晰整洁。

生成的描述文件在sootOutput目录下,每个函数一个文件(*.dot)。

使用Graphviz生成流程图

首先在官网下载Graphviz。使用指令:

1
<path-to-dot.exe> -Tpng '.\***.dot' -o ***.png

成果

最终生成的流程图如下:

example