Goプロジェクトのコールグラフを生成する可能性を探しています。 C++クラスの Doxygenのダイアグラム機能 に似たもの(オプション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
これにより、プログラムの実行中にプログラムの呼び出しスタックが1秒あたり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
ただし、依存関係グラフのみが作成されます。
あなたは…/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/...
を使用してインストールできます。リテラル/...
はすべてのサブパッケージに一致します)。
例えば。 callgraph
だけを実行すると、次で始まる使用法の出力が生成されます。
callgraph:Goプログラムの呼び出しグラフを表示します。
使用法:
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
各呼び出しグラフEdgeが表示される形式を指定します。の一つ:digraph output suitable for input to golang.org/x/tools/cmd/digraph. graphviz output in AT&T GraphViz (.dot) format.
(Goのテンプレート構文を使用して)任意の形式の出力、graphvizまたはdigraph出力を生成できます。最後は、go install golang.org/x/tools/cmd/digraph
を使用してインストールできるツールで(引数なしで実行すると、フル/ヘルプの使用法が表示されます)、任意の有向グラフに関するクエリ(明らかに呼び出しグラフを含む)に応答できます。
ここを見てください: 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
と入力します。
例えば-これが私が書いたバッファプール実装の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
これはこれを出力します:
私は最近golangコールグラフを使用しており、python + CallingViewerと呼ばれるコールグラフをここで呼び出します https://github.com/fiefdx/CallingViewer 、ラフですが、機能します。以下のスクリーンショット: CallingViewerのスクリーンショット