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.
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).
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:
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