首页 > 其他分享 >Go每日一库之165:go-callvis(可视化调用链)

Go每日一库之165:go-callvis(可视化调用链)

时间:2023-10-01 09:04:17浏览次数:36  
标签:callvis err package default 一库 go string

本文介绍一款工具 go-callvis,它能够将 Go 代码的调用关系可视化出来,并提供了可交互式的 web 服务。

go-callvis 使用

依赖
  • Go 1.17+
  • Graphviz (可选,当工具指定了 -graphviz 时需要)
工具安装
go get -u github.com/ofabry/go-callvis
# or
git clone https://github.com/ofabry/go-callvis.git
cd go-callvis && make install
示例
package main

import (
    
    func main() {
        // Part 1: create a listener
        l, err := net.Listen("tcp", ":8000")
        if err != nil {
            log.Fatalf("Error listener returned: %s", err)
        }
        defer l.Close()
        
        for {
            // Part 2: accept new connection
            c, err := l.Accept()
            if err != nil {
                log.Fatalf("Error to accept new connection: %s", err)
            }
            
            // Part 3: create a goroutine that reads and write back data
            go func() {
                log.Printf("TCP session open")
                defer c.Close()
                
                for {
                    d := make([]byte, 1024)
                    
                    // Read from TCP buffer
                    _, err := c.Read(d)
                    if err != nil {
                        log.Printf("Error reading TCP session: %s", err)
                        break
                    }
                    log.Printf("reading data from client: %s\n", string(d))
                    
                    // write back data to TCP client
                    _, err = c.Write(d)
                    if err != nil {
                        log.Printf("Error writing TCP session: %s", err)
                        break
                    }
                }
            }()
        }
}

以上是一个简单的TCP服务端代码,通过 go-callvis 工具,可将其代码调用关系梳理出来。

$ go-callvis main.go
2022/08/14 21:23:03 http serving at http://localhost:7878
2022/08/14 21:23:03 converting dot to svg..
2022/08/14 21:23:03 serving file: /var/folders/xk/gn46n46d503dsztbc6_9qb2h0000gn/T/go-callvis_export.svg

go-callvis 默认将代码调用关系存储成 svg 格式的图形,并会在 http://localhost:7878 服务上进行展示。

在浏览器界面上,如果点击 log 单元,将会进入 log 模块的代码调用交互图中。

使用参数

go-callvis 默认以 main 作为链路起点进行分析,因此 package 需要为 main 包。

go-callvis [flags] package

如果不想从 main 方法开始,那么需要使用 -tests 参数,并且在 yourpackage 下创建单元测试,在测试中调用你想要的起始点方法。

go-callvis -tests yourpackage

详细使用说明可通过执行 go-callvis 命令查看

$ go-callvis
go-callvis: visualize call graph of a Go program.

Usage:

go-callvis [flags] package

Package should be main package, otherwise -tests flag must be used.

Flags:

-algo string
The algorithm used to construct the call graph. Possible values inlcude: "static", "cha", "rta", "pointer" (default "pointer")
-cacheDir string
Enable caching to avoid unnecessary re-rendering, you can force rendering by adding 'refresh=true' to the URL query or emptying the cache directory
-debug
Enable verbose log.
-file string
output filename - omit to use server mode
-focus string
Focus specific package using name or import path. (default "main")
-format string
output file format [svg | png | jpg | ...] (default "svg")
-graphviz
Use Graphviz's dot program to render images.
-group string
Grouping functions by packages and/or types [pkg, type] (separated by comma) (default "pkg")
-http string
HTTP service address. (default ":7878")
-ignore string
Ignore package paths containing given prefixes (separated by comma)
-include string
Include package paths with given prefixes (separated by comma)
-limit string
Limit package paths to given prefixes (separated by comma)
-minlen uint
Minimum edge length (for wider output). (default 2)
-nodesep float
Minimum space between two adjacent nodes in the same rank (for taller output). (default 0.35)
-nodeshape string
graph node shape (see graphvis manpage for valid values) (default "box")
-nodestyle string
graph node style (see graphvis manpage for valid values) (default "filled,rounded")
-nointer
Omit calls to unexported functions.
-nostd
Omit calls to/from packages in standard library.
-rankdir string
Direction of graph layout [LR | RL | TB | BT] (default "LR")
-skipbrowser
Skip opening browser.
-tags build tags
a list of build tags to consider satisfied during the build. For more information about build tags, see the description of build constraints in the documentation for the go/build package
-tests
Include test code.
-version
Show version and exit.
[slp@slpdeMacBook-Pro:] ~/repo/MongoShake/cmd/collector $ go-callvis --help
Usage of go-callvis:
-algo string
The algorithm used to construct the call graph. Possible values inlcude: "static", "cha", "rta", "pointer" (default "pointer")
-cacheDir string
Enable caching to avoid unnecessary re-rendering, you can force rendering by adding 'refresh=true' to the URL query or emptying the cache directory
-debug
Enable verbose log.
-file string
output filename - omit to use server mode
-focus string
Focus specific package using name or import path. (default "main")
-format string
output file format [svg | png | jpg | ...] (default "svg")
-graphviz
Use Graphviz's dot program to render images.
-group string
Grouping functions by packages and/or types [pkg, type] (separated by comma) (default "pkg")
-http string
HTTP service address. (default ":7878")
-ignore string
Ignore package paths containing given prefixes (separated by comma)
-include string
Include package paths with given prefixes (separated by comma)
-limit string
Limit package paths to given prefixes (separated by comma)
-minlen uint
Minimum edge length (for wider output). (default 2)
-nodesep float
Minimum space between two adjacent nodes in the same rank (for taller output). (default 0.35)
-nodeshape string
graph node shape (see graphvis manpage for valid values) (default "box")
-nodestyle string
graph node style (see graphvis manpage for valid values) (default "filled,rounded")
-nointer
Omit calls to unexported functions.
-nostd
Omit calls to/from packages in standard library.
-rankdir string
Direction of graph layout [LR | RL | TB | BT] (default "LR")
-skipbrowser
Skip opening browser.
-tags build tags
a list of build tags to consider satisfied during the build. For more information about build tags, see the description of build constraints in the documentation for the go/build package
-tests
Include test code.
-version
     Show version and exit.

每个参数都有对应的说明,无需详细介绍。

有几个比较有用的参数可以注意:nostd用以忽略标准库的调用;group用以对函数分类;includelimitignore参数则用以控制过滤或保留调用关系。

总结

go-callvis 工具将 Go 程序函数调用关系通过图形可视化出来,它能帮助开发人员更好地梳理程序脉络。且 go-callvis 的使用非常简单,可以开箱即用。

之后同学们在接触复杂项目时,不妨用 go-callvis 试试看

标签:callvis,err,package,default,一库,go,string
From: https://www.cnblogs.com/arena/p/17738581.html

相关文章

  • Go每日一库之164:uiprogress(终端进度条)
    今天给大家推荐的是在终端(terminal)下能够显示进度条的工具:uiprogress。先看下使用该包的效果图:相信大家在linux或mac终端上都下载过东西,然后会出现下载的进度条。今天我们就给大家分析下实现原理并演示其效果。安装$goget-vgithub.com/gosuri/uiprogress实现原理分析实......
  • Go每日一库之162:throttled(轻量级限流工具)
    throttled是一个非常轻量且易扩展的限流组件,我们可以将它轻松地集成到应用程序中,以实现限流和配额管理的能力。简介throttled(https://github.com/throttled/throttled)基于通用信元速率算法实现了对资源的访问速率限制,资源可以是特定的URL、用户或者任何自定义的形式,可以很......
  • Go每日一库之161:grm(Redis Web管理工具)
    GRM是基于go+vue的web版redis管理工具,部署简单便捷,支持SSH连接,用户校验,操作日志、命令行模式、LUA脚本执行等功能。介绍基于go+vue的web版redis管理工具【Webredismanagementtoolbasedongolangandvue】功能清单管理连接(直连和SSH)、切换DB支持string/lis......
  • Go每日一库之160:gvm(Go版本管理)
    **gvm**用于go版本的管理,主要的功能为go版本的查看,下载安装和切换。安装$bash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)Cloningfromhttps://github.com/moovweb/gvm.gitto/Users/admin/.gvmCreatedprofilef......
  • Go每日一库之159:bubbletea(控制台界面程序)
    简介[bubbletea](https://github.com/charmbracelet/bubbletea)是一个简单、小巧、可以非常方便地用来编写TUI(terminalUserInterface,控制台界面程序)程序的框架。内置简单的事件处理机制,可以对外部事件做出响应,如键盘按键。一起来看下吧。先看看bubbletea能做出什么效果:感谢k......
  • Go每日一库之158:termtables(表格形式数据输出)
    简介今天学个简单点的,[termtables](https://github.com/scylladb/termtables)处理表格形式数据的输出。适用于随时随地的输出一些状态或统计数据,便于观察和调试。是一个很小巧的工具库。我在学习[dateparse](https://darjun.github.io/2021/06/24/godailylib/dateparse/)库时偶尔......
  • Go每日一库之157:tproxy (TCP连接代理与分析 )
    你有同感吗?当大家在开发服务端代码的时候,会不会经常有如下疑问?纳闷MySQL连接池到底有多少连接?每个连接的生命周期持续多久?连接异常断开的时候到底是服务端主动断的,还是客户端主动断的?当长时间没有请求的时候,底层库是否有KeepAlive请求?复杂网络情况的处理从来都是后端......
  • Go每日一库之155:go-spew(输出 Go 数据结构)
    对于应用的调试,我们经常会使用fmt.Println来输出关键变量的数据。或者使用log库,将数据以log的形式输出。对于基础数据类型,上面两种方法都可以比较方便地满足需求。对于一些结构体类型数据,通常我们可以先将其序列化后再输出。如果结构体中包含不可序列化的字段,比如func类型......
  • Go每日一库之154:eCapture(无需CA证书抓包https)
    eCapture介绍eCapture是一款基于eBPF技术实现的用户态数据捕获工具。不需要CA证书,即可捕获https/tls的通讯明文。项目在2022年3月中旬创建,一经发布,广受大家喜爱,至今不到两周已经1200多个Star。作用不需要CA证书,即可捕获HTTPS/TLS通信数据的明文。在bash审计场景,可以捕获ba......
  • Go每日一库之153:categraf (数据采集 Agent)
    简介Categraf是夜莺监控的默认数据采集Agent,主打开箱即用和all-in-one,同时支持对metrics、log、trace的收集,由夜莺监控核心开发团队开发。Categraf的代码托管在两个地方:中国计算学会确实开源平台:https://www.gitlink.org.cn/flashcat/categrafGithub:https://github.com/......