From 7f68e1b49d89f723b2282414194df9e5d4970a53 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Mon, 22 Jan 2018 16:43:36 -0700 Subject: [PATCH] Move gorouting dump handler to norman --- signal/dump.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 signal/dump.go diff --git a/signal/dump.go b/signal/dump.go new file mode 100644 index 00000000..70718ccc --- /dev/null +++ b/signal/dump.go @@ -0,0 +1,44 @@ +package signal + +import ( + "bytes" + "io" + "os" + "os/signal" + "runtime" + + "github.com/maruel/panicparse/stack" +) + +func GoroutineDumpOn(signals ...os.Signal) { + c := make(chan os.Signal, 1) + signal.Notify(c, signals...) + go func() { + for range c { + var ( + buf []byte + stackSize int + ) + bufferLen := 16384 + for stackSize == len(buf) { + buf = make([]byte, bufferLen) + stackSize = runtime.Stack(buf, true) + bufferLen *= 2 + } + buf = buf[:stackSize] + src := bytes.NewBuffer(buf) + if goroutines, err := stack.ParseDump(src, os.Stderr); err == nil { + buckets := stack.SortBuckets(stack.Bucketize(goroutines, stack.AnyValue)) + srcLen, pkgLen := stack.CalcLengths(buckets, true) + p := &stack.Palette{} + for _, bucket := range buckets { + _, _ = io.WriteString(os.Stderr, p.BucketHeader(&bucket, true, len(buckets) > 1)) + _, _ = io.WriteString(os.Stderr, p.StackLines(&bucket.Signature, srcLen, pkgLen, true)) + } + } else { + io.Copy(os.Stderr, src) + + } + } + }() +}