How to dump goroutine stacktraces?
There is an HTTP frontend for the runtime/pprof
package mentioned in Intermernet's answer. Import the net/http/pprof package to register an HTTP handler for /debug/pprof
:
import _ "net/http/pprof"
import _ "net/http"
Start an HTTP listener if you do not have one already:
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
Then point a browser to http://localhost:6060/debug/pprof
for a menu, or http://localhost:6060/debug/pprof/goroutine?debug=2
for a full goroutine stack dump.
There are other fun things you can learn about your running code this way too. Check out the blog post for examples and more details: http://blog.golang.org/profiling-go-programs
To print the stack trace for the current goroutine, use PrintStack()
from runtime/debug
.
PrintStack prints to standard error the stack trace returned by Stack.
For example:
import(
"runtime/debug"
)
...
debug.PrintStack()
To print the stack trace for all goroutines use Lookup
and WriteTo
from runtime/pprof
.
func Lookup(name string) *Profile
// Lookup returns the profile with the given name,
// or nil if no such profile exists.
func (p *Profile) WriteTo(w io.Writer, debug int) error
// WriteTo writes a pprof-formatted snapshot of the profile to w.
// If a write to w returns an error, WriteTo returns that error.
// Otherwise, WriteTo returns nil.
Each Profile has a unique name. A few profiles are predefined:
goroutine - stack traces of all current goroutines
heap - a sampling of all heap allocations
threadcreate - stack traces that led to the creation of new OS threads
block - stack traces that led to blocking on synchronization primitives
For example:
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)