Создание графа вызовов

Я ищу возможность генерировать граф вызовов для проектов 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

Что выводит это:

callgraph-example-poolio

Ответ 3

Недавно я использовал golang callgraph, и я создаю веб-инструмент с помощью python + callgraph под названием CallingViewer здесь: https://github.com/fiefdx/CallingViewer, это может быть грубо, но это работает, снимок экрана ниже: снимок экрана CallingViewer