From e1ceaf791f3edef1a9f3a181e0a4552079a270ba Mon Sep 17 00:00:00 2001 From: name5566 Date: Mon, 1 Jun 2015 23:21:04 +0800 Subject: [PATCH] print a stack trace of panicking goroutines. --- chanrpc/chanrpc.go | 13 +++++++++++-- conf/conf.go | 3 +++ go/go.go | 26 +++++++++++++++++++++++--- module/module.go | 10 +++++++++- timer/timer.go | 10 +++++++++- 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 conf/conf.go diff --git a/chanrpc/chanrpc.go b/chanrpc/chanrpc.go index 19e160c7..fb4bc221 100644 --- a/chanrpc/chanrpc.go +++ b/chanrpc/chanrpc.go @@ -3,6 +3,8 @@ package chanrpc import ( "errors" "fmt" + "github.com/name5566/leaf/conf" + "runtime" ) // one server per goroutine (goroutine not safe) @@ -88,8 +90,15 @@ func (s *Server) ret(ci *CallInfo, ri *RetInfo) (err error) { func (s *Server) Exec(ci *CallInfo) (err error) { defer func() { if r := recover(); r != nil { - err = fmt.Errorf("%v", r) - s.ret(ci, &RetInfo{err: err}) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + err = fmt.Errorf("%v: %s", r, buf) + } else { + err = fmt.Errorf("%v", r) + } + + s.ret(ci, &RetInfo{err: fmt.Errorf("%v", r)}) } }() diff --git a/conf/conf.go b/conf/conf.go new file mode 100644 index 00000000..16ccb195 --- /dev/null +++ b/conf/conf.go @@ -0,0 +1,3 @@ +package conf + +var LenStackBuf = 1024 diff --git a/go/go.go b/go/go.go index 0ea6a7ad..e1092282 100644 --- a/go/go.go +++ b/go/go.go @@ -2,7 +2,9 @@ package g import ( "container/list" + "github.com/name5566/leaf/conf" "github.com/name5566/leaf/log" + "runtime" "sync" ) @@ -37,7 +39,13 @@ func (g *Go) Go(f func(), cb func()) { defer func() { g.ChanCb <- cb if r := recover(); r != nil { - log.Error("%v", r) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + log.Error("%v: %s", r, buf) + } else { + log.Error("%v", r) + } } }() @@ -49,7 +57,13 @@ func (g *Go) Cb(cb func()) { defer func() { g.pendingGo-- if r := recover(); r != nil { - log.Error("%v", r) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + log.Error("%v: %s", r, buf) + } else { + log.Error("%v", r) + } } }() @@ -89,7 +103,13 @@ func (c *LinearContext) Go(f func(), cb func()) { defer func() { c.g.ChanCb <- e.cb if r := recover(); r != nil { - log.Error("%v", r) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + log.Error("%v: %s", r, buf) + } else { + log.Error("%v", r) + } } }() diff --git a/module/module.go b/module/module.go index bbf52e28..f6309e5c 100644 --- a/module/module.go +++ b/module/module.go @@ -1,7 +1,9 @@ package module import ( + "github.com/name5566/leaf/conf" "github.com/name5566/leaf/log" + "runtime" "sync" ) @@ -55,7 +57,13 @@ func run(m *module) { func destroy(m *module) { defer func() { if r := recover(); r != nil { - log.Error("%v", r) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + log.Error("%v: %s", r, buf) + } else { + log.Error("%v", r) + } } }() diff --git a/timer/timer.go b/timer/timer.go index 526c1caf..ebbb1977 100644 --- a/timer/timer.go +++ b/timer/timer.go @@ -2,7 +2,9 @@ package timer import ( "errors" + "github.com/name5566/leaf/conf" "github.com/name5566/leaf/log" + "runtime" "time" ) @@ -32,7 +34,13 @@ func (t *Timer) Cb() { defer func() { t.cb = nil if r := recover(); r != nil { - log.Error("%v", r) + if conf.LenStackBuf > 0 { + buf := make([]byte, conf.LenStackBuf) + runtime.Stack(buf, false) + log.Error("%v: %s", r, buf) + } else { + log.Error("%v", r) + } } }()