使用go-callvis查看函数调用流程
使用go-callvis查看逻辑复杂的项目的函数调用流程,减少理解成本
go-callvis是什么
go-callvis是代码调用链路可视化工具,是代码方法级别的调用关系,主要用于代码设计。可视化工具可以将代码间的调用关系通过图表的方式展示出来,如下图。
如何生成调用关系图
go-callvis除了可以生成图片文件,还可以生成svg图,它默认会启动一个Web Server,我们可以在浏览器访问它的地址,在页面上实现交互式的浏览调用关系。
SVG:
1 | SVG是一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形。 |
下面是一段SVG代码:
1 | <g id="a_clust3"><a xlink:href="/?f=github.com/goccy/go-graphviz/cgraph" xlink:title="package: github.com/goccy/go-graphviz/cgraph"> |
可以看到和HTML类似,同样是一种标记语言。
go-callvis使用介绍
首先使用go get -u github.com/ofabry/go-callvis
命令进行安装,安装完成后go-callvis将出现在你得GOPATH/bin目录下。
命令行参数解释:
1 | go-callvis: visualize call graph of a Go program. |
使用示例
1. 最简单的命令如下:
1 | go-callvis . |
此命令会在当前目录进行分析,如果没有错误,会自动打开浏览器,在浏览器中展示图
2. 指定package
1 | go-callvis github.com/ofabry/go-callvis |
指定的package是main,工具将以main方法作为起始点进行链路生成
3. 指定包含单元测试方法的package
1 | go-callvis -tests yourpackage |
如果不想从main方法开始,可以使用-tests参数,在想要进行链路生成的package下面创建一个单元测试方法,测试方法中调用你想要作为起始点的方法。
4. 输出结果到文件
以上都是打开浏览器进行交互式浏览和操作,如果只要输出文件,可以使用-file参数
1 | go-callvis -file yourfilename -format png yourpackage |
5. include、limit、ignore参数
这三个参数用来控制过滤哪些调用关系(pkg1.FuncA -> pkg2.FuncB,形成一条调用关系,pkg1.FuncA为caller,pkg2.FuncB为callee)。例如代码中频繁出现的log包方法调用,没必要输出到链路中。可以使用ignore参数进行过滤
1 | go-callvis -ignore yourlogpkg yourpackage |
- 当调用关系中caller的pkg或者callee的pkg有任意一个在include中,则这条关系被保留。
- 不满足1时,当调用关系中caller的pkg或者callee的pkg有任意一个不在limit中,则这条关系被过滤。
- 不满足1时,当调用关系中caller的pkg或者callee的pkg有任意一个在ignore中,则这条关系被过滤。
6. 过滤标准库
过滤掉代码中频繁使用的标准库方法调用,例如:fmt、math、strings等
1 | go-callvis -nostd yourpackage |
7. build tags
go build命令可以允许我们传入-tags参数,来控制编译的版本
1 | go build -tags release |
例如有两个配置文件dev_config.go和release_config.go,内容分别为
dev_config.go
1 | // +build dev |
release_config.go
1 | // +build release |
每个文件都有一个编译选项(+build),编译器会根据-tags传入的参数识别应该编译哪一个文件。从而达到区分环境的效果。
go-callvis的tags参数同理。
本地代码使用实战
以kcp-go为例
1 | go-callvis -nostd examples/echo.go |
main包调用情况,点击黄色区域可以查看kcp包的调用情况(会耗时几分钟)
查看函数调用最密集的地方,也是最核心的地方,如下图便是Input,这也是kcp-go中最核心的代码