web-dev-qa-db-fra.com

Créer un graphe d'appel en golang

Je recherche une possibilité de générer un graphe d’appel pour des projets golang. Quelque chose de semblable à Fonctionnalité de diagramme de Doxygen pour les classes C++ (avec l'option CALL_GRAPH = YES).

Jusqu'ici j'ai trouvé

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

Ceci échantillonne la pile d'appels de votre programme 100 fois par seconde pendant son exécution et crée un graphique utile pour le profilage. Si votre programme passe le plus clair de son temps dans des fonctions qui ne vous intéressent pas, cette solution ne m'a pas semblé très utile.

Ensuite, il y a ceci:

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

ce qui, de par sa description, ressemble à ce dont j’aurais besoin, mais il ne semble pas exister de documentation et je ne comprends pas comment l’utiliser.

J'ai aussi trouvé

https://github.com/davecheney/graphpkg/blob/master/README.md
et
https://github.com/paetzke/go-dep-graph/blob/master/README.org

mais ils ne créent que des graphes de dépendance.

13
alex

Vous étiez proche avec… /x/tools/go/callgraph/static. Je suis à peu près sûr que go install golang.org/x/tools/cmd/callgraph est ce que vous voulez. Une fois installé, lancez-le sans argument pour voir son aide/utilisation complète.

(En général, les éléments sous… /x/tools/ sont des packages quelque peu réutilisables avec des interfaces en ligne de commande résidant sous… /x/tools/cmd, vous pouvez tous les installer avec go install golang.org/x/tools/cmd/..., le littéral /... correspondant à tous les sous-packages).

Par exemple. exécuter callgraph uniquement produit une sortie d'utilisation commençant par:

callgraph : affiche le graphe d'appel d'un programme Go.

Usage:

callgraph [-algo=static|cha|rta|pta] [-test] [-format=...] <args>...

Drapeaux:

-algo Spécifie l'algorithme de construction de graphe d'appel, l'un des suivants:

        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 Incluez les tests du package dans l'analyse.

-format Spécifie le format d'affichage de chaque graphe d'appel Edge. Un des:

        digraph     output suitable for input to
                    golang.org/x/tools/cmd/digraph.
        graphviz    output in AT&T GraphViz (.dot) format.

Il peut produire des sorties au format arbitraire (en utilisant la syntaxe du modèle de Go), des sorties graphviz ou digraph. Le dernier est un outil que vous pouvez installer avec go install golang.org/x/tools/cmd/digraph (et une fois encore, l'utilisation complète/help est vue en l'exécutant sans arguments) et qui peut répondre aux requêtes sur les graphes dirigés arbitraires (y compris les graphes d'appel évidemment).

10
Dave C

Jetez un coup d'œil ici: 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
}

Construisez et exécutez votre programme comme d'habitude. Vous verrez le crochet de profilage mentionné:

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

Exécutez votre programme (testez-le, exécutez-le, etc.) pour générer le profil pendant l'exécution. Une fois que vous avez atteint ce que vous voulez, quittez puis générez le graphe d’appel:

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

Vous pouvez également exécuter go tool pprof $YOURPROGBINARY cpu.pprof pour obtenir une invite interactive dans laquelle vous pouvez appeler top10 ou web pour générer un svg. Tapez help à l'invite pprof pour obtenir une liste de commandes.

par exemple. - voici le profil de l'unité centrale pour une implémentation de pool de mémoire tampon, j'ai écrit:

~/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

Et voici un moyen rapide de générer un fichier PNG à partir de l'invite:

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

Ce qui sort ceci:

callgraph-example-poolio

9
elithrar

J'ai récemment utilisé golang callgraph et je construis un outil Web appelé CallingViewer avec python + callgraph ici: https://github.com/fiefdx/CallingViewer , c'est peut-être difficile, mais cela fonctionne, la capture d'écran ci-dessous: capture d'écran de CallingViewer

0
fiefdx