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

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,格式规范如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"data": [
{
"caller": "main",
"callee": "main"
},
{
"caller": "main",
"callee": "A"
}
]
}

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

Step3:制作时序图

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -*- 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中即可,等待一会之后,我们就可以得到绘制好的时序图,可保存为文件。

文章作者: 陈高勋
文章链接: https://nmchgx.com/analysis-java-with-static-method/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 陈高勋的博客