在golang中创建调用图

时间:2015-07-11 22:10:56

标签: go call-graph

我正在寻找为golang项目生成调用图的可能性。类似于Doxygen's diagram functionality的C ++类(使用选项CALL_GRAPH = YES)。

到目前为止我找到了

http://saml.rilspace.org/profiling-and-creating-call-graphs-for-go-programs-with-go-tool-pprof

http://blog.golang.org/profiling-go-programs

在程序运行时,每秒100次对程序的调用堆栈进行采样,并创建一个对分析有用的图形。如果你的程序大部分时间都花在与你无关的函数上,我发现这个解决方案不是很有用。

然后有这个:

https://godoc.org/golang.org/x/tools/go/callgraph/static

从其描述中听起来像我需要的,但似乎没有文档,我不明白如何使用它。

我也找到了

https://github.com/davecheney/graphpkg/blob/master/README.md

https://github.com/paetzke/go-dep-graph/blob/master/README.org

但他们只创建依赖图。

4 个答案:

答案 0 :(得分:10)

你和... /x/tools/go/callgraph/static很接近。我很确定go install golang.org/x/tools/cmd/callgraph就是你想要的。安装完成后,无需参数即可运行,以查看它的完整帮助/用法。

(一般情况下,...... /x/tools/下的内容是一些可重复使用的包,其命令行前端位于... /x/tools/cmd下,您可以使用go install golang.org/x/tools/cmd/...安装它们,文字{ {1}}匹配所有子包。)

E.g。仅运行/...产生的使用输出以:

开头
  

callgraph :显示Go程序的调用图。

     

用法:

     

callgraph

     

标志:

     

callgraph [-algo=static|cha|rta|pta] [-test] [-format=...] <args>...指定调用图构造算法,其中之一是:

-algo
     

static static calls only (unsound) cha Class Hierarchy Analysis rta Rapid Type Analysis pta inclusion-based Points-To Analysis The algorithms are ordered by increasing precision in their treatment of dynamic calls (and thus also computational cost). RTA and PTA require a whole program (main or test), and include only functions reachable from main. 在分析中包含软件包的测试。

     

-test指定显示每个调用图边的格式。              其中之一:

-format

它可以产生任意格式化的输出(使用Go的模板语法)或graphviz或有向图输出。最后一个是您可以使用 digraph output suitable for input to golang.org/x/tools/cmd/digraph. graphviz output in AT&T GraphViz (.dot) format. 安装的工具(再一次,通过运行不带参数来查看完整/帮助用法)并且可以回答有关任意有向图的查询(显然包括调用图)。

答案 1 :(得分:9)

看看这里:http://dave.cheney.net/2014/10/22/simple-profiling-package-moved-updated

func main() {
    defer profile.Start(profile.CPUProfile, profile.ProfilePath(".")).Stop()
    // Rest of program
}

按正常方式构建并运行程序。您将看到提到的分析钩子:

2015/07/12 09:02:02 profile: cpu profiling enabled, cpu.pprof

运行程序(替换它,运行它等)以在运行时生成配置文件。一旦你达到你想要的效果,退出然后生成调用图:

go tool pprof --pdf $YOURPROGBINARY cpu.pprof > cgraph.pdf

您还可以运行go tool pprof $YOURPROGBINARY cpu.pprof以获取交互式提示,您可以在其中调用top10web来生成svg。在pprof提示符下键入help以获取命令列表。

e.g。 - 这是我写的缓冲池实现的CPU配置文件:

~/Desktop go tool pprof poolio cpu.pprof
Entering interactive mode (type "help" for commands)
(pprof) top5
24770ms of 35160ms total (70.45%)
Dropped 217 nodes (cum <= 175.80ms)
Showing top 5 nodes out of 74 (cum >= 650ms)
      flat  flat%   sum%        cum   cum%
   12520ms 35.61% 35.61%    12520ms 35.61%  runtime.mach_semaphore_wait
    9300ms 26.45% 62.06%     9360ms 26.62%  syscall.Syscall
    1380ms  3.92% 65.98%     2120ms  6.03%  encoding/json.(*encodeState).string
    1030ms  2.93% 68.91%     1030ms  2.93%  runtime.kevent
     540ms  1.54% 70.45%      650ms  1.85%  runtime.mallocgc

以下是从提示符生成PNG的快捷方法:

(pprof) png > graph.png
Generating report in graph.png

哪个输出:

callgraph-example-poolio

答案 2 :(得分:1)

另一种使用 golang.org/x/tools go/callgraph 的方法是 ofabry/go-callvis 项目:
(转到 1.13+)

<块引用>

此工具的目的是使用来自调用图的数据及其与包和类型的关系,为开发人员提供 Go 程序的可视化概览。

  • 支持 Go 模块!
  • 关注程序中的特定包
  • 单击包以使用交互式查看器快速切换焦点
  • 按包和/或按类型对方法进行分组
  • 过滤包到特定的导入路径前缀
  • 忽略标准库中的函数
  • 省略各种类型的函数调用

示例(基于此 Go code project):

https://raw.githubusercontent.com/ofabry/go-callvis/master/images/main.png

工作原理

它运行 pointer analysis 来构建程序的调用图,并使用数据在 dot format 中生成输出,可以使用 Graphviz 工具进行渲染。

要使用提供聚焦包的 SVG 图像的 Web 服务器提供的交互式视图,您只需运行:

go-callvis <target package>

HTTP 服务器默认监听 http://localhost:7878/,使用选项 -http="ADDR:PORT" 更改 HTTP 服务器地址。

答案 3 :(得分:0)

我最近使用了golang callgraph,我在这里使用python + callgraph构建了一个名为CallingViewer的web工具:https://github.com/fiefdx/CallingViewer,它可能很粗糙,但它有效,截图如下: screenshot of CallingViewer