我正在寻找为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
但他们只创建依赖图。
答案 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
以获取交互式提示,您可以在其中调用top10
或web
来生成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
哪个输出:
答案 2 :(得分:1)
另一种使用 golang.org/x/tools
go/callgraph
的方法是 ofabry/go-callvis 项目:
(转到 1.13+)
此工具的目的是使用来自调用图的数据及其与包和类型的关系,为开发人员提供 Go 程序的可视化概览。
示例(基于此 Go code project):
它运行 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