Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/protolambda/gocyto
Callgraph analysis and visualization for Go
https://github.com/protolambda/gocyto
Last synced: about 1 month ago
JSON representation
Callgraph analysis and visualization for Go
- Host: GitHub
- URL: https://github.com/protolambda/gocyto
- Owner: protolambda
- License: mit
- Created: 2019-07-13T02:43:44.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-09-24T13:53:16.000Z (over 2 years ago)
- Last Synced: 2024-12-10T10:03:07.627Z (about 2 months ago)
- Language: Go
- Size: 36.1 KB
- Stars: 162
- Watchers: 6
- Forks: 20
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- my-awesome - protolambda/gocyto - 09 star:0.2k fork:0.0k Callgraph analysis and visualization for Go (Go)
README
# Gocyto
A Go [SSA](https://godoc.org/golang.org/x/tools/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](#supported-callgraph-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](./callgraph.png)
## Usage
Provide a Go package pattern to load the packages, and produce the call-graph.
```bash
# From the directory containing `index.gohtml` for templating
gocyto --out prysm_out.html --query-dir ../prysm/beacon-chain --web github.com/prysmaticlabs/prysm/beacon-chain/...
```### options
```
gocyto [options...]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
-query-dir string
Directory to query from for go packages. Current dir if empty
-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:
```go
program, err := analysis.RunAnalysis(withTests, buildFlags, packagePatterns)
```Constructing a callgraph:
```go
analysis.PointerAnalysis.ComputeCallgraph(program)
```### Supported callgraph analysis types:
- [`PointerAnalysis`](golang.org/x/tools/go/pointer)
- [`StaticAnalysis`](golang.org/x/tools/go/callgraph/static)
- [`ClassHierarchyAnalysis`](golang.org/x/tools/go/callgraph/cha)
- [`RapidTypeAnalysis`](golang.org/x/tools/go/callgraph/rta)## `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](http://js.cytoscape.org/#notation/elements-json).Constructing a cyto graph:
```go
// 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`](https://github.com/TrueFurby/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`](https://github.com/CorgiMan/prospect/blob/master/main.go)
- minimal
- outdated, 4 years old
- limited callgraph information extracted
- looks like the origin of godoc callgraph tool (???)[`callgraph`](https://github.com/golang/tools/blob/master/cmd/callgraph/main.go)
- digraph and graphviz output support
- doesn't add extra information (description/classes) to the calls
- supports same set of analysis algorithms[`godoc/analysis`](https://godoc.org/golang.org/x/tools/godoc/analysis)
- different visualization; go-doc complement, tree-view/code navigation
- Powers [call-graph navigation](https://golang.org/lib/godoc/analysis/help.html)## License
MIT License, see LICENSE file.