静态分析Golang语言生成函数调用关系的利器——go-callvis

目录

  • 升级go
    • 删除旧版本
    • 安装新版本
    • 配置环境变量
    • 载入环境
      • 修改当前环境
      • 修改之后进入的环境
  • 分析
    • 安装go-callvis
    • 分析其他包
      • 总结
    • 导出文件
      • 总结
    • 清晰主体脉络
      • 总结
    • 其他
  • 参考资料

不同于之前分析C语言项目的工具,go-callvis还是很方便使用。只要把两项工作做好就能顺利的使用。

  1. go使用1.19及以上版本。
  2. 要在被分析工程的根目录执行分析指令。

我的测试环境是Ubuntu 22 TLS版,默认的Golang是1.18。这会导致go-callvis安装失败。如果版本匹配,可以忽略下面Golang升级的步骤。

升级go

删除旧版本

sudo apt remove golang-go golang-1.18-doc golang-1.18-go golang-1.18-src

安装新版本

直接上1.21版本。

sudo apt install golang-1.21

配置环境变量

sudo vim /etc/profile

在文件末尾另起新行填入以下内容

export GOROOT=/usr/lib/go-1.21
export GOPATH=$HOME/gowork
export GOBIN=$GOPATH/bin
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH

载入环境

修改当前环境

source /etc/profile

修改之后进入的环境

sudo vim ~/.bashrc

在文件末尾另起一行新增

source /etc/profile

分析

我们以gorush的源码为例。它是一套基于Gin实现的消息推送框架。

https://github.com/appleboy/gorush.git

安装go-callvis

进入待分析工程目录

cd gorush

然后安装

go install github.com/ofabry/go-callvis@master

最后执行分析命令

go-callvis ./

2024/01/28 07:55:35 http serving at http://localhost:7878
2024/01/28 07:55:35 OpenURL error: exec: “xdg-open,x-www-browser,www-browser”: executable file not found in $PATH

这样我们就在浏览器中打开http://localhost:7878看到分析结果
在这里插入图片描述
go-callvis默认是寻找main包名,并以此为入口分析代码调用关系的。而且每个方法是以包名聚合的。如上图中,nats就是一个包名,其下的方法都被聚合在一起。这个特性由-group指定,默认是pkg(包),还可以是type。

分析其他包

如果我们希望分析其他包名,则需要使用-focus指定,而且路径要制定到包所在的目录(注意不是根目录),并且还要添加-algo static。如果路径不对,go-callvis会找不到对应的包(不会遍历子目录)。比如我们需要查看router包,它实际位于~/gorush/router目录下。如果执行

go-callvis -focus router -algo static ./

则会报错

focus failed, could not find package: router

正确的指令是

 go-callvis -algo static -focus router ./router/

在这里插入图片描述

总结

 go-callvis -algo static -focus 【package_name】 ./【package_path】

导出文件

上述方法都会启动一个服务器,然后在浏览器中查看。如果网络环境不允许,则我们可以让其产出图片。-format用于指定文件格式;-file用于指定导出的文件名。

 go-callvis -algo static \-focus router \-format=png \-file=gorush_router \./router/

2024/01/28 08:14:51 writing dot output…
2024/01/28 08:14:51 converting dot to png…

请添加图片描述
如果觉得这个图太长,则可以使用-rankdir转变成其他绘制方向([LR | RL | TB | BT] (default “LR”))。

go-callvis -algo static \-focus router \-format=png \-file=gorush_router_tb \-rankdir TB \./router/

请添加图片描述

总结

 go-callvis -algo static \-focus 【package_name】\-format=[svg | png | jpg | ...] (default "svg")\-file=【file_name】\./【package_path】

清晰主体脉络

上面的图片还是很大,提供了大量信息。但是大量的信息也会带来一些干扰,我们可以通过增加一些参数,忽略一些不太重要的信息,来让调用框架清晰起来。

-nointer
Omit calls to unexported functions.
-nostd
Omit calls to/from packages in standard library.

-nostd表示标准库的包就不用展现了,这个可以省去大量最后一层的调用关系;-nointer则表示忽略非导出方法,这样我们就关注于包之间调用关系即可。

go-callvis -algo static \-focus router \-format=png \-file=gorush_router_noiter_nostd \-nointer -nostd \./router/

请添加图片描述

总结

 go-callvis -algo static \-focus 【package_name】\-format=[svg | png | jpg | ...] (default "svg")\-file=【file_name】\-nointer -nostd \./【package_path】

其他

我还对gin的源码做了测试

git clone https://github.com/gin-gonic/gin.git
cd gin
go install github.com/ofabry/go-callvis@master
go-callvis -algo static -focus gin -format=png -file=gin -nointer -nostd ./

请添加图片描述

参考资料

  • https://github.com/ondrajz/go-callvis/tree/master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439145.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯AT24C02问题记录

问题1:从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样,第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS;nop()要延时1个指令周期。延时时间不对会对时序产生影响,时序不对,则AT24C02有没被使用…

C语言KR圣经笔记 5.12 复杂声明

5.12 复杂声明 C 语言有时会因为声明的语法而受到谴责,特别是涉及函数指针的声明语法。语法试图使声明和使用一致;在简单的情况下它的效果不错,但在更复杂的情况下会让人困惑,因为声明不能从左往右读,而且括号被过度使…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者:爱写代码的刚子 时间:2024.1.29 前言&#xff1…

Go语言中HTTP代理的请求和响应过程

在Go语言中,HTTP代理的实现涉及对请求和响应的拦截、转发和处理。下面将详细介绍这个过程。 请求过程: 客户端发起请求:客户端(例如浏览器或其他应用程序)发送HTTP请求到代理服务器。建立连接:代理服务器…

Git怎样用?(下载到本地,和在本地初始化)

全局设置: 点击第二个 输入: 例如;邮箱是随意地 git config --global user.name "名字" git config --global user.email "邮箱" 获取git仓库 本地初始化: 创建仓库 右键第二个 输入 git init 克隆&#…

nssctf round17

level1 基础共模攻击 # #真签到题 # from Crypto.Util.number import bytes_to_long, getPrime # from secret import getflag # # e1 getPrime(1024) # e2 getPrime(1024) # n e1 * e2 # m bytes_to_long(getflag().encode()) # c1 pow(m, e1, n) # c2 pow(m, e2, n) …

血细胞分类项目

血细胞分类项目 数据集:血细胞分类数据集数据处理 dataset.py网络 net.py训练 train.py拿训练集的几张图进行预测 数据集:血细胞分类数据集 https://aistudio.baidu.com/datasetdetail/10278 数据处理 dataset.py from torchvision import transfor…

Codeforces Round 799 (Div. 4)

目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…

webassembly003 TTS BARK.CPP

TTS task TTS&#xff08;Text-to-Speech&#xff09;任务是一种自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;其中模型的目标是将输入的文本转换为声音&#xff0c;实现自动语音合成。具体来说&#xff0c;模型需要理解输入的文本并生成对应的语音输出&#xff0…

ZYNQ:CAN外设应用存在的问题

流程 为了用ZYNQ实现CAN总线功能&#xff0c;分为多个阶段&#xff1a; 1学习小梅哥视频&#xff0c;了解zynq简单工作搭建的流程&#xff0c;比如点亮LED。 GPIO 功能 按照小梅哥的视频搭建ZYNQ-PS应用系统时&#xff0c;vitis没有出现ps7_gpio_0这个硬件。这导致vitis软件…

私有化部署pdf工具箱

功能简介 用于合并/拆分/旋转/移动PDF及其页面的完全交互式GUI。 将多个 PDF 合并到一个生成的文件中。 将 PDF 拆分为多个文件&#xff0c;并按指定的页码或将所有页面提取为单个文件。 将 PDF 页面重新组织为不同的顺序。 以 90 度为增量旋转 PDF。 删除页面。 多页布局…

24. 两两交换链表中的节点(力扣LeetCode)

文章目录 24. 两两交换链表中的节点题目描述解题思路只使用一个临时节点使用两个临时节点 24. 两两交换链表中的节点 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff0…