Skip to content
Callgraph analysis and visualization for Go
Go
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
analysis
render
.gitattributes add preview Jul 14, 2019
.gitignore output html w/ cytoscapejs Jul 14, 2019
LICENSE initial commit Jul 13, 2019
README.md
callgraph.png add preview Jul 14, 2019
go.mod
go.sum
index.gohtml update, now with signature based colors Jul 14, 2019
main.go update, now with signature based colors Jul 14, 2019

README.md

Gocyto

A Go SSA callgraph builder and visualizer, by @protolambda.

Features:

  • output to generic Cytoscape JSON format. (list of nodes, list of edges)
  • output to a single html file, with js dependencies in unpkg, and graph data embedded.
  • outputs can be written to program output, or to a file.
  • use different SSA analysis types
  • support for Go-modules (powered by golang.org/x/tools/go/packages)
  • graph data is nested: packages > types / globals > attached functions
  • nodes are colored based on signature (50% parameters blend, 50% results blend)
  • all edges/nodes enhanced with classes to style/filter the graph with
go get github.com/protolambda/gocyto

Example output

This is the web output of the callgraph of Gocyto, including unexported functions:

Callgraph of gocyto itself

Usage

Provide a Go package pattern to load the packages, and produce the call-graph.

gocyto github.com/user/project/some/package/...

options

gocyto [options...] <package path(s)>

Options:

  -build string
    	Build flags to pass to Go build tool. Separated with spaces
  -go-root
    	Include packages part of the Go root
  -mode string
    	Type of analysis to run. One of: pointer, cha, rta, static (default "pointer")
  -out string
    	Output file, if none is specified, output to std out
  -tests
    	Consider tests files as entry points for call-graph
  -unexported
    	Include unexported function calls
  -web
    	Output an index.html with graph data embedded instead of raw JSON

gocyto/analysis

To easily load packages into a SSA program, and construct callgraphs.

Loading packages:

program, err := analysis.RunAnalysis(withTests, buildFlags, packagePatterns)

Constructing a callgraph:

analysis.PointerAnalysis.ComputeCallgraph(program)

Supported callgraph analysis types:

gocyto/render

Loads call-graph into a Cyto-graph object. After loading your graph (or multiple), the data can be output to JSON to load with cytoscape.

Constructing a cyto graph:

// Base object, manages nodes, edges and keeps track of a [full-name -> ID] map for shorter IDs
cytoGraph := render.NewCytoGraph()

// more options to be decided on later, PRs welcome
opts := &render.RenderOptions{
    IncludeGoRoot: false,
    IncludeUnexported: false,
}

// add call graph from SSA analysis to cyto graph
err := cytoGraph.LoadCallGraph(callGraph, opts)

// add more call graphs if you like

Comparison

go-callvis

  • Similar purpose
  • bloated/hacky code
  • uses deprecated SSA package loading
  • no re-usable library code
  • an ugly non-go Graphviz dependency
  • no Go module support.
  • limited styling
  • hacky build-tags support (overwriting the default Go build flags during runtime...)

prospect

  • minimal
  • outdated, 4 years old
  • limited callgraph information extracted
  • looks like the origin of godoc callgraph tool (???)

callgraph

  • digraph and graphviz output support
  • doesn't add extra information (description/classes) to the calls
  • supports same set of analysis algorithms

godoc/analysis

License

MIT License, see LICENSE file.

You can’t perform that action at this time.