From c6d54329c20b9bcdcf6e288815e4103596c0a5bb Mon Sep 17 00:00:00 2001 From: Timothy Date: Fri, 24 Jun 2016 18:53:57 +0800 Subject: [PATCH] Output panic function and line in recover func --- godns.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/godns.go b/godns.go index 7f01324..d734ef1 100644 --- a/godns.go +++ b/godns.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os" + "runtime" "runtime/debug" "strings" "time" @@ -23,10 +24,39 @@ var ( panicCount = 0 ) +func identifyPanic() string { + var name, file string + var line int + var pc [16]uintptr + + n := runtime.Callers(3, pc[:]) + for _, pc := range pc[:n] { + fn := runtime.FuncForPC(pc) + if fn == nil { + continue + } + file, line = fn.FileLine(pc) + name = fn.Name() + if !strings.HasPrefix(name, "runtime.") { + break + } + } + + switch { + case name != "": + return fmt.Sprintf("%v:%v", name, line) + case file != "": + return fmt.Sprintf("%v:%v", file, line) + } + + return fmt.Sprintf("pc:%x", pc) +} + func usage() { log.Println("[command] -c=[config file path]") flag.PrintDefaults() } + func main() { flag.Parse() if *optHelp { @@ -57,6 +87,7 @@ func dnsLoop() { if err := recover(); err != nil { panicCount++ log.Printf("Recovered in %v: %v\n", err, debug.Stack()) + fmt.Println(identifyPanic()) if panicCount < PANIC_MAX { log.Println("Got panic in goroutine, will start a new one... :", panicCount) go dnsLoop()