web-dev-qa-db-ja.com

コールグラフを作成する

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

ただし、依存関係グラフのみが作成されます。

19
alex

あなたは…/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を使用してインストールできるツールで(引数なしで実行すると、フル/ヘルプの使用法が表示されます)、任意の有向グラフに関するクエリ(明らかに呼び出しグラフを含む)に応答できます。

11
Dave C

ここを見てください: 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

これはこれを出力します:

callgraph-example-poolio

10
elithrar

私は最近golangコールグラフを使用しており、python + CallingViewerと呼ばれるコールグラフをここで呼び出します https://github.com/fiefdx/CallingViewer 、ラフですが、機能します。以下のスクリーンショット: CallingViewerのスクリーンショット

1
fiefdx