2015-07-11 13 views
12

Poszukuję możliwości wygenerowania wykresu połączeń dla projektów golang. Coś podobnego do Doxygen's diagram functionality dla klas C++ (z opcją CALL_GRAPH = YES).Tworzenie wykresu połączeń w golang

tej pory znalazłem

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

Ten próbki stos wywołanie programu 100 razy na sekundę, podczas gdy program jest uruchomiony i tworzy wykres przydatnych do profilowania. Jeśli twój program spędza większość czasu na funkcjach, które nie są dla ciebie ważne, uznałam, że to rozwiązanie nie jest zbyt przydatne.

Wtedy nie jest to:

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

który z jego opis brzmi jak to, co muszę, ale nie wydaje się być żadnych docs i nie rozumiem, w jaki sposób z niego korzystać.

Znalazłem również

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

ale tworzą tylko zależnościami wykresy.

Odpowiedz

9

Spójrz tutaj: 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 
} 

zbudować i uruchomić program, jak za normalne. Zobaczysz hak profilowania wymienić:

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

uruchomić program (ławki, uruchom przez nią, etc), aby wygenerować profil podczas wykonywania. Po trafienie, co chcesz, a następnie rzucić wygenerowania call-graph:

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

Można również uruchomić go tool pprof $YOURPROGBINARY cpu.pprof uzyskać interaktywny wiersz, gdzie można zadzwonić top10 lub web wygenerować SVG. Wpisz help w zachęcie pprof, aby uzyskać listę poleceń.

np. - oto profil CPU do realizacji puli buforów I napisał:

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

A oto szybki sposób wygenerować PNG z wiersza:

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

które wyjścia to:

callgraph-example-poolio

+0

Jest to metoda opisana w pierwszy link, o którym wspomniałem; Zapomniałem połączyć z oryginalną stroną. Dla mnie nie daje to satysfakcjonujących rezultatów; Widzę wiele wywołań funkcji, które mnie nie interesują, ale nie widzę wywołań funkcji, które mnie interesują. Po wykonaniu niektórych profilów widzę niektóre z interesujących funkcji, ale nigdy nie wszystkie. Czy nie ma statycznego narzędzia, które po prostu przechodzi przez kod i tworzy wykresy? – alex

+0

Jednym z moich problemów jest to, że interesują mnie również funkcje, które są wykonywane tylko raz (podczas instalacji). Czy istnieje sposób na zwiększenie częstotliwości próbkowania narzędzia, s.t. prawdopodobieństwo zwiększa się, że próbkowane są także funkcje krótko działające? – alex

+0

Częstotliwość próbkowania jest zakodowana na stałe w czasie wykonywania/pprof.go: 587 za pośrednictwem runtime.SetCPUProfileRate (hz) z Hz = 100, tj. 100 próbek na sekundę. Jeśli wywołasz metodę runtime.SetCPUProfileRate (desiredSamplingRate) * przed * wywołaniem profile.Start(), można to zmienić. Próba ustawienia częstotliwości próbkowania po wywołaniu funkcji profile.Start() nie będzie działać ("środowisko wykonawcze: nie można ustawić szybkości profilu cpu, dopóki nie zakończy się poprzedni profil."). – alex

9

Byłeś blisko z ... /x/tools/go/callgraph/static. Jestem całkiem pewny, że jest to, czego potrzebujesz. Po zainstalowaniu uruchom go bez argumentów, aby zobaczyć pełną obsługę/użycie.

(Na ogół rzeczy pod ... /x/tools/ są nieco opakowań wielokrotnego użytku z wiersza poleceń przednich końców żyjące pod ... /x/tools/cmd, można zainstalować je wszystkie z go install golang.org/x/tools/cmd/..., dosłownych /... pasuje do wszystkich sub-pakietów).

E.g. działa tylko callgraph produkuje wyjście użytkowania, który zaczyna się:

callgraph: wyświetlić wykres Wywołanie programu Go.

Zastosowanie:

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

Flagi:

-algo Określa algorytm budowy call-graph, jeden z:

 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 obejmować testy z pakietami w analizie.

-format Określa format wyświetlania każdej krawędzi wykresu wywołania. Jedną:

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

To może produkować dowolną sformatowany wyjście (używając Go składni szablonu) lub graphviz lub wyjście digraf. Ostatnim z nich jest narzędzie, które można zainstalować przy pomocy go install golang.org/x/tools/cmd/digraph (i ponownie można zobaczyć pełne/pomocne użycie, uruchamiając je bez argumentów) i można odpowiadać na zapytania dotyczące dowolnie skierowanych wykresów (w tym oczywiście wykresów wywołań).

+0

Dzięki! Eksperymentowałem z callgraph przy użyciu różnych znaczników algo i próbowałem stworzyć plik pdf za pomocą graphviz/dot lub zapytać o wynik kaligrafu za pomocą digrafu.Niestety, wyjście callgraph zawiera głównie go libs, a tworzenie pliku pdf z wyjścia callgraph nie daje niczego użytecznego. Możliwości zapytania w digrafach mogą okazać się pomocne. Najlepsze rozwiązanie byłoby dla mnie, gdybym mógł odfiltrować wywołania funkcji go lib - szczególnie te głęboko zagnieżdżone, do których mój kod nie jest nawet odpowiedzialny. Może po prostu mogę trochę postprocessing z wynikiem callgraph. – alex

+0

Istnieje kolejna poważna przeszkoda, która uniemożliwia mi używanie callgraph - odmawia on pracy, kiedy importuję wiązania ZeroMQ (github.com/pebbe/zmq3). Pierwszym wyjściem jest "cgo pkg-config nie jest obsługiwane", a także wiele błędów "niezadeklarowanej nazwy" z pakietu zmq, chociaż są one zadeklarowane w pakiecie. – alex

Powiązane problemy