Parses panic stack traces, densifies and deduplicates goroutines with similar stack traces. Helps debugging crashes and deadlocks in heavily parallelized process.
panicparse helps make sense of Go crash dumps:
See v2.0.1 blog post.
- New in v2.0.0!: Full go module support.
- New in v2.0.0!: Race detector support.
- New in v2.0.0!: HTML export.
- New in v2.0.0!: Completely refactored stack package for higher performance.
- New in v1.4.0!: webstack.SnapshotHandler is a http handler that serves a very tight and swell snapshot of your goroutines, much more readable than net/http/pprof.
- >50% more compact output than original stack dump yet more readable.
- Deduplicates redundant goroutine stacks. Useful for large server crashes.
- Arguments as pointer IDs instead of raw pointer values.
- Pushes stdlib-only stacks at the bottom to help focus on important code.
- Parses the source files if available to augment the output.
- Works on Windows.
webstack in action
go get github.com/maruel/panicparse/v2/cmd/pp
Piping a stack trace from another process
- Ubuntu (bash v4 or zsh):
- macOS, install bash 4+, then:
- Windows or macOS with stock bash v3:
- Fish shell:
go test -v |&pp
Windows or macOS native bash (which is 3.2.57): They don't have this shortcut, so use the long form:
go test -v 2>&1 | pp
Fish: It uses ^ for stderr redirection so the shortcut is
go test -v ^|pp
PowerShell: It has broken
2>&1 redirection. The workaround is to shell out to cmd.exe. :(
On POSIX, use
Ctrl-\ to send SIGQUIT to your process,
pp will ignore the signal and will parse the stack trace.
Parsing from a file
To dump to a file then parse, pass the file path of a stack trace
go test 2> stack.txt pp stack.txt
Starting with go1.11, the toolchain starts to inline more often. This causes traces to be less informative. You can use the following to help diagnosing issues:
go install -gcflags '-l' path/to/foo foo |& pp
go test -gcflags '-l' ./... |& pp
Starting with Go 1.6,
GOTRACEBACK defaults to
single instead of
1 that was used in 1.5 and before. To get all goroutines trace and not just the crashing one, set the environment variable:
set GOTRACEBACK=all on Windows. Probably worth to put it in your
Updating bash on macOS
If you have
If you try
pp for the first time and you get:
Creating tables and indexes... Done.
/usr/bin/pp5.18: No input files specified
you may be running the Perl PAR Packager instead of panicparse.
You have two choices, either you put
$GOPATH/bin at the beginning of
$PATH or use long name
go get github.com/maruel/panicparse/v2
panicparse instead of
go test 2> panicparse