实践:Java代码静态分析函数调用及生成时序图

Author Avatar
陈高勋 1月 03, 2017
  • 在其它设备中阅读本文章

Step1:生成Java代码静态分析结果

这里我们采用的是开源的工具java-callgraph来做Java代码的静态分析,根据官方的说明需按下面步骤来实现:

1.克隆项目到本地

git clone https://github.com/gousiosg/java-callgraph

2.用maven安装项目

mvn install

若未安装 maven,macOS用户可尝试使用 homebrew 安装,brew update && brew install maven,其他用户可访问官网安装。

3.打包被测试文件

我们需要借助Eclipse来将我们的被测试文件打包为jar包,打包后的文件记为 test.jar

4.运行工具生成结果

test.jar 移动到工具安装目录下的 ./target 目录下。

只需一个命令就可生成静态分析结果:

java -jar javacg-0.1-SNAPSHOT-static.jar test.jar

其中结果的具体含义请参照工具的官方介绍。

将结果保存为文件即可。

Step2:处理分析结果

需要把分析结果过滤得到我们需要用的信息,并用 json 格式存储,保存为文件 test.json,格式规范如下:

{
    "data": [
        {
            "caller": "main",
            "callee": "main"
        },
        {
            "caller": "main",
            "callee": "A"
        }
    ]
}

其中 caller 代表函数调用者,callee 代表函数被调用者。

Step3:制作时序图

制作时序图采用的工具是Web Sequence Diagrams在线时序图绘制工具。

根据工具说明要将我们的函数调用关系再格式化,处理成形如 A->B: 调用 的格式,下面是格式化的 python 代码:

# -*- coding: utf-8 -*-
import json
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def store(data):
    with open('test.json', 'w') as json_file:
        json_file.write(json.dumps(data))

def load():
    with open('test.json') as json_file:
        data = json.load(json_file)
        return data['data']



if __name__ == "__main__":
    data = load()

    n = len(data)
    f = open("test.txt", "w+")
    for i in range(0, n):
        f.write("%s->%s: 调用\n"%(data[i]['caller'],data[i]['callee']))

格式化后我们得到处理后的文本 test.txt,将文本内容复制到Web Sequence Diagrams中即可,等待一会之后,我们就可以得到绘制好的时序图,可保存为文件。