您當前的位置:首頁 > 繪畫

一款好用的 Go 呼叫鏈視覺化工具

作者:由 Golang發燒友 發表于 繪畫時間:2022-08-19

在接手他人程式碼或調研一些開源專案時,如果能夠理清其中的程式碼呼叫鏈路,這將加速我們對實現的理解。

本文介紹一款工具 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 服務上進行展示。

一款好用的 Go 呼叫鏈視覺化工具

在瀏覽器介面上,如果點選 log 單元,將會進入 log 模組的程式碼呼叫互動圖中。

一款好用的 Go 呼叫鏈視覺化工具

使用引數

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

用以對函式分類;

include

limit

ignore

引數則用以控制過濾或保留呼叫關係。

總結

go-callvis 工具將 Go 程式函式呼叫關係透過圖形可視化出來,它能幫助開發人員更好地梳理程式脈絡。且 go-callvis 的使用非常簡單,可以開箱即用。

之後同學們在接觸複雜專案時,不妨用 go-callvis 試試看。

原文連結:

https://

mp。weixin。qq。com/s/1UhS

S9mJBf_C6j9Mpx14uA

標簽: go  callvis  default  package  err