stacktraces

package module
v0.0.0-...-0f98d2f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 19, 2017 License: BSD-3-Clause Imports: 6 Imported by: 0

README

stacktraces

GoDoc

stacktraces is a package that makes it easier to bluntly print stacktraces of all running Go routines on specific signals. Some additional packages are also included for automatically setting up for SIGUSR1, SIGUSR2, SIGTERM, and SIGINT.

Note that if you use this on SIGTERM and SIGINT, this would prevent the process from terminating as in default behavior.

Example

/tmp/example/main.go:

package main

import (
	"time"

	_ "github.com/songgao/stacktraces/on/SIGUSR2"
)

func main() {
	time.Sleep(time.Minute)
}
$ go build && ./example

Now, send SIGUSR2 to the process:

$ killall -SIGUSR2 example

The process keeps running but prints following to stderr:

$ go build && ./example
--- contention:
cycles/second=2900012405
goroutine 7 [running]:
runtime/pprof.writeGoroutineStacks(0x25f1c0, 0xc82002a018, 0x0, 0x0)
	/Users/songgao/go/src/runtime/pprof/pprof.go:516 +0x84
runtime/pprof.writeGoroutine(0x25f1c0, 0xc82002a018, 0x2, 0x0, 0x0)
	/Users/songgao/go/src/runtime/pprof/pprof.go:505 +0x46
runtime/pprof.(*Profile).WriteTo(0x1c1500, 0x25f1c0, 0xc82002a018, 0x2, 0x0, 0x0)
	/Users/songgao/go/src/runtime/pprof/pprof.go:236 +0xd4
github.com/songgao/stacktraces.Set.func1(0xc820056060, 0x25f1c0, 0xc82002a018)
	/Users/songgao/gopath/src/github.com/songgao/stacktraces/stacktraces.go:71 +0xfa
created by github.com/songgao/stacktraces.Set
	/Users/songgao/gopath/src/github.com/songgao/stacktraces/stacktraces.go:74 +0xcd

goroutine 1 [sleep]:
time.Sleep(0xdf8475800)
	/Users/songgao/go/src/runtime/time.go:59 +0xf9
main.main()
	/tmp/example/main.go:10 +0x26

goroutine 5 [syscall]:
os/signal.signal_recv(0x25b078)
	/Users/songgao/go/src/runtime/sigqueue.go:116 +0x132
os/signal.loop()
	/Users/songgao/go/src/os/signal/signal_unix.go:22 +0x18
created by os/signal.init.1
	/Users/songgao/go/src/os/signal/signal_unix.go:28 +0x37

goroutine 6 [select, locked to thread]:
runtime.gopark(0x1565c0, 0xc820028728, 0x123260, 0x6, 0x18, 0x2)
	/Users/songgao/go/src/runtime/proc.go:262 +0x163
runtime.selectgoImpl(0xc820028728, 0x0, 0x18)
	/Users/songgao/go/src/runtime/select.go:392 +0xa67
runtime.selectgo(0xc820028728)
	/Users/songgao/go/src/runtime/select.go:215 +0x12
runtime.ensureSigM.func1()
	/Users/songgao/go/src/runtime/signal1_unix.go:279 +0x32c
runtime.goexit()
	/Users/songgao/go/src/runtime/asm_amd64.s:1998 +0x1
heap profile: 1: 1048576 [1: 1048576] @ heap/1048576
1: 1048576 [1: 1048576] @ 0x3f4e5 0x817a5 0x816e6 0x7d064 0x7b53a 0x5a461
#	0x817a5	runtime/pprof.writeGoroutineStacks+0x45		/Users/songgao/go/src/runtime/pprof/pprof.go:514
#	0x816e6	runtime/pprof.writeGoroutine+0x46		/Users/songgao/go/src/runtime/pprof/pprof.go:505
#	0x7d064	runtime/pprof.(*Profile).WriteTo+0xd4		/Users/songgao/go/src/runtime/pprof/pprof.go:236
#	0x7b53a	github.com/songgao/stacktraces.Set.func1+0xfa	/Users/songgao/gopath/src/github.com/songgao/stacktraces/stacktraces.go:71


# runtime.MemStats
# Alloc = 1163176
# TotalAlloc = 1163176
# Sys = 4458744
# Lookups = 3
# Mallocs = 306
# Frees = 22
# HeapAlloc = 1163176
# HeapSys = 1671168
# HeapIdle = 147456
# HeapInuse = 1523712
# HeapReleased = 0
# HeapObjects = 284
# Stack = 425984 / 425984
# MSpan = 6960 / 16384
# MCache = 4800 / 16384
# BuckHashSys = 1442264
# NextGC = 4194304
# PauseNs = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# NumGC = 0
# EnableGC = true
# DebugGC = false
threadcreate profile: total 8
8 @

Documentation

Overview

Package stacktraces provides a utility function `Set` to make your Go program print stack traces of all running Go routines on particularly signals.

As an example:

// file /tmp/example/main.go
//
package main

import (
	"os"
	"syscall"
	"time"

	"github.com/songgao/stacktraces"
)

func main() {
	stacktraces.Set(os.Stderr, syscall.SIGUSR1)
	time.Sleep(time.Minute)
}

When the above code is running, send a `SIGUSR1` signal to the process, and it will print stacktraces:

$ killall -SIGUSR1 example

However, in most cases, you'd want this done automatically. This package has a few subdirectories (under `on` directory) that have `init()` function defined to automatically set up on corresponding signals. For example, following is equivelent to the `/tmp/example/main.go` above:

package main

import (
	"time"

	_ "github.com/songgao/-stacktraces/on/SIGUSR1"
)

func main() {
	time.Sleep(time.Minute)
}

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Set

func Set(writer io.Writer, signals ...syscall.Signal)

Set makes the process catch signals, and write stack traces of all currently running Go routines to writer.

Types

This section is empty.

Directories

Path Synopsis
on

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL