当前位置: 首页 > 科技观察

一个好用的Go调用链可视化工具

时间:2023-03-12 22:59:26 科技观察

在接手别人的代码或者调研一些开源项目的时候,如果能够梳理一下代码调用链,会加快我们理解实现的速度。本文介绍一个工具go-callvis,可以可视化Go代码的调用关系,提供交互式的web服务。go-callvis使用依赖Go1.17+Graphviz(可选,当工具指定了-graphviz时候需要)工具安装goget-ugithub.com/ofabry/go-callvis#orgitclonehttps://github.com/ofabry/go-callvis.gitcdgo-callvis&&makeinstall示例packagemainimport(funcmain(){//Part1:createalistenerl,err:=net.Listen("tcp",":8000")iferr!=nil{log.Fatalf("Errorlistenerreturned:%s",err)}deferl.Close()for{//第2部分:接受新连接c,err:=l.Accept()iferr!=nil{log.Fatalf("Errortoacceptnewconnection:%s",err)}//第3部分:创建一个读取和写回数据的goroutinegofunc(){log.Printf("TCPsessionopen")deferc.Close()for{d:=make([]byte,1024)//从TCP缓冲区读取_,err:=c.Read(d)iferr!=nil{log.Printf("读取错误TCPsession:%s",err)break}log.Printf("readingdatafromclient:%s\n",string(d))//写回数据给TCPclient_,err=c.Write(d)如果错误!=nil{log.Printf("ErrorwritingTCPsession:%s",err)break}}}()}}以上是一段简单的TCP服务端代码,通过go-callvis工具,可以理清代码调用关系$go-callvismain.go2022/08/1421:23:03http服务于http://localhost:78782022/08/1421:23:03将点转换为svg..2022/08/1421:23:03服务文件:/var/folders/xk/gn46n46d503dsztbc6_9qb2h0000gn/T/go-callvis_export.svggo-callvis默认将代码调用关系存储为svg格式的图形,显示在http://localhost:7878服务上。在浏览器界面,点击日志单元,会进入日志模块的代码调用交互图。使用参数go-callvis默认以main作为分析链接的起点,所以package需要是主包。如果go-callvis[flags]包不想从main方法开始,那么就需要使用-tests参数,并在yourpackage下创建一个单元测试,在测试中调用你想要的起点方法。go-callvis-testsyourpackage详细使用说明可通过执行go-callvis命令查看$go-callvisgo-callvis:可视化Go程序的调用图。用法:go-callvis[flags]package包应该是主包,否则-tests必须使用标志。标志:-algostring用于构造调用图的算法。可能的值包括:“static”、“cha”、“rta”、“pointer”(默认为“pointer”)-cacheDirstring启用缓存以避免不必要的重新渲染,您可以通过在URL查询或清空缓存目录-debug启用详细日志。-filestring输出文件名-省略使用服务器模式-focusstring使用名称或导入路径聚焦特定包。(默认“main”)-format字符串输出文件格式[svg|PNG|图片|...](默认为“svg”)-graphviz使用Graphviz的dot程序渲染图像。-groupstring按包和/或类型[pkg,type]分组函数(以逗号分隔)(默认t"pkg")-http字符串HTTP服务地址。(默认“:7878”)-ignorestring忽略包含给定前缀的包路径(以逗号分隔)-includestring包含具有给定前缀的包路径(以逗号分隔)-limitstring将包路径限制为给定前缀(以逗号分隔)-minlenuint最小边长(用于更宽的输出)。(默认2)-nodesepfloat同一等级中两个相邻节点之间的最小空间(用于更高的输出)。(默认0.35)-nodeshape字符串图形节点形状(有效值请参见graphvis联机帮助页)(默认为“box”)-nodestyle字符串图形节点样式(有效值请参见graphvis联机帮助页)(默认为“filled,rounded”)-nointer省略调用到未导出的函数。-nostd省略对标准库中包的调用/从包中调用。-rankdirstring图布局的方向[LR|RL|结核病|BT](默认“LR”)-skipbrowser跳过打开浏览器。-tags构建标签a在构建过程中要考虑满足的构建标签列表。有关构建标签的更多信息,请参阅go/buildpackage-tests包含测试代码的文档中构建约束的说明。-version显示版本并退出。[slp@slpdeMacBook-Pro:]~/repo/MongoShake/cmd/collector$go-callvis--helpGo-callvis的用法:-algostring用于构造调用图的算法。可能的值包括:“static”、“cha”、“rta”、“pointer”(默认为“pointer”)-cacheDirstring启用缓存以避免不必要的重新渲染,您可以通过在URL查询或清空缓存目录-debug启用详细日志。-filestring输出文件名-省略使用服务器模式-focusstring使用名称或导入路径聚焦特定包。(默认“main”)-format字符串输出文件格式[svg|PNG|图片|...](default"svg")-graphviz使用Graphviz的dotprogr我要渲染图像。-groupstring按包和/或类型[pkg,type]分组函数(以逗号分隔)(默认为“pkg”)-httpstringHTTP服务地址。(默认“:7878”)-ignorestring忽略包含给定前缀的包路径(以逗号分隔)-includestring包含具有给定前缀的包路径(以逗号分隔)-limitstring将包路径限制为给定前缀(以逗号分隔)-minlenuint最小边长(用于更宽的输出)。(默认2)-nodesepfloat同一等级中两个相邻节点之间的最小空间(用于更高的输出)。(默认0.35)-nodeshape字符串图形节点形状(有效值请参见graphvis联机帮助页)(默认为“box”)-nodestyle字符串图形节点样式(有效值请参见graphvis联机帮助页)(默认为“filled,rounded”)-nointer省略调用到未导出的函数。-nostd省略对标准库中包的调用/从包中调用。-rankdir字符串图形布局的方向[LR|RL|结核病|BT](默认“LR”)-skipbrowser跳过打开浏览器。-tagsbuildtags在构建过程中考虑满足的构建标签列表。有关构建标签的更多信息,请参阅go/buildpackage-tests包含测试代码的文档中构建约束的说明。-version显示版本并退出。每个参数都有相应的说明,无需详细介绍。有几个有用的参数可以关注一下:nostd用来忽略标准库调用;group用于对函数进行分类;include,limit,andignore参数用于控制过滤或保留调用关系。小结go-callvis工具通过图形将Go程序函数的调用关系可视化,可以帮助开发者更好的梳理程序上下文。而且go-callvis的使用非常简单,开箱即用。之后,当同学们接触到复杂的项目时,不妨用go-callvis试一试。