2015-07-11 2 views
12

Я ищу возможность генерировать график вызовов для проектов golang. Нечто похожее на Doxygen's diagram functionality для классов C++ (с опцией CALL_GRAPH = YES).Создание графика вызовов в golang

До сих пор я нашел

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

, который из его описания звучит как то, что мне нужно было, но там, кажется, нет никаких Docs, и я не понимаю, как использовать его.

Я также нашел

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

, но они создают только зависимостями графики.

ответ

9

Посмотрите здесь: 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, чтобы получить список команд.

например. - вот профиль ЦП для реализации пула буферов я написал:

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

+0

Это метод, описанный в первая ссылка, о которой я говорил; Я забыл ссылку на исходный сайт. Для меня это не дает удовлетворительных результатов; Я вижу много вызовов функций, которые меня не интересуют, но я не вижу функций, которые меня интересуют вообще. После некоторых прогонов профилей я вижу некоторые интересные функции, но не все. Нет ли статического инструмента, который просто проходит через код и создает графики? – alex

+0

Одна из моих проблем заключается в том, что меня также интересуют функции, которые выполняются только один раз (во время установки). Есть ли способ увеличить частоту дискретизации инструмента, s.t. вероятность того, что функции короткого запуска также будут выбраны? – alex

+0

Частота дискретизации жестко запрограммирована во время выполнения/pprof.go: 587 через runtime.SetCPUProfileRate (hz) с hz = 100, то есть 100 выборок в секунду. Если вы вызываете runtime.SetCPUProfileRate (wishSamplingRate) * перед * вызовом profile.Start(), это можно переопределить. Попытка установить частоту дискретизации после вызова profile.Start() не будет работать («runtime: не может установить скорость профиля cpu до тех пор, пока предыдущий профиль не закончится».). – alex

9

Вы были рядом с ... /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/..., буквальным /... спичек все суб-пакеты).

E.g. работает только 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. 

Он может производить произвольный форматированный вывод (используя шаблон синтаксис Гоу) или Graphviz или выход орграф. Последний - это инструмент, который вы можете установить с помощью go install golang.org/x/tools/cmd/digraph (и еще раз, полное/использование справки видно, запустив его без аргументов) и может отвечать на запросы о произвольных ориентированных графах (включая графы вызовов).

+0

Спасибо! Я экспериментировал с callgraph с использованием различных флагов algo и пытался создать pdf-файл с использованием graphviz/dot или запросить вывод callgraph с помощью орграфа.К сожалению, вывод callgraph содержит в основном go libs и создание pdf-файла из вывода callgraph не дает ничего полезного. Возможности запроса орграфа могут оказаться полезными. Лучшим решением для меня было бы, если бы я мог отфильтровать вызовы функций go lib, особенно глубоко вложенные, для которых мой код даже не ответственен. Возможно, я могу просто выполнить постобработку с результатом callgraph. – alex

+0

Есть еще одно серьезное препятствие, которое мешает мне использовать callgraph - он отказывается работать, когда я импортирую привязки ZeroMQ (github.com/pebbe/zmq3). Первый вывод: «cgo pkg-config not supported» и множество ошибок «необъявленного имени» из пакета zmq, хотя они объявлены в пакете. – alex

0

Я использовал golang граф вызовов в последнее время, и я создать веб-инструмент с питоном + граф вызовов под названием CallingViewer здесь: https://github.com/fiefdx/CallingViewer, это может быть, грубо, но это работает, скриншот в поле ниже: screenshot of CallingViewer

+0

Выглядит интересно, попробуем позже – alex

Смежные вопросы