Golang panic 列印堆疊資訊
阿新 • • 發佈:2018-11-28
一. 緣起
- 程式程序後臺執行
- monitor 監控程式負責拉起程式
當因為邏輯問題導致後臺程序掛掉時,不容易發現程式曾經掛過。
golang 可以通過 recover 捕獲 error,並將 panic 時的堆疊列印到日誌來定位問題。
$ tree panictest
panictest
├── main.go
└── panic
└── panic.go
二. 程式碼
main.go
package main
import (
"fmt"
"os"
"./panic"
)
func test() {
defer func() {
if e := recover(); e != nil {
panic.PrintStack()
os.Exit(1)
}
}()
zero := 0
x := 3 / zero
fmt.Println("x=", x)
}
func main() {
test()
}
panic.go
package panic
import (
"fmt"
"runtime"
)
func PrintStack() {
var buf [4096 ]byte
n := runtime.Stack(buf[:], false)
fmt.Printf("==> %s\n", string(buf[:n]))
}
三. 執行結果
$ go run main.go
==> goroutine 1 [running]:
_/tmp/panictest/panic.PrintStack()
/tmp/panictest/panic/panic.go:10 +0x5b
main.test.func1()
/tmp/panictest/main.go:13 +0x44
panic(0x49c640, 0x525390)
/usr/local/go /src/runtime/panic.go:505 +0x229
main.test()
/tmp/panictest/main.go:19 +0x3e
main.main()
/tmp/panictest/main.go:24 +0x20
exit status 1
能夠看出問題出在main.go:19
的x := 3 / zero
這一行。
可以將fmt.Println
替換成你的日誌輸出函式。