Создание графа вызовов
Я ищу возможность генерировать граф вызовов для проектов Go. Нечто подобное функциональности диаграммы Кислорода для классов 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
но они создают только графы зависимостей.
Ответы
Ответ 1
Вы были рядом с... /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
Определяет формат отображения каждого графа графика вызова. Один из:
digraph output suitable for input to
golang.org/x/tools/cmd/digraph.
graphviz output in AT&T GraphViz (.dot) format.
Он может производить произвольный форматированный вывод (с использованием синтаксиса шаблона Go) или графического или графического вывода. Последний - это инструмент, который вы можете установить с помощью go install golang.org/x/tools/cmd/digraph
(и опять-таки полное/использование справки рассматривается путем запуска его без аргументов) и может отвечать на запросы о произвольных направленных графах (включая вызов графики).
Ответ 2
Взгляните сюда: 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. Введите help
в приглашении pprof, чтобы получить список команд.
например - здесь профиль 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
Что выводит это:
Ответ 3
Недавно я использовал golang callgraph, и я создаю веб-инструмент с помощью python + callgraph под названием CallingViewer здесь: https://github.com/fiefdx/CallingViewer, это может быть грубо, но это работает, снимок экрана ниже: снимок экрана CallingViewer