1. 程式人生 > >Golang panic 列印堆疊資訊

Golang panic 列印堆疊資訊

一. 緣起

  • 程式程序後臺執行
  • 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:19x := 3 / zero這一行。

可以將fmt.Println替換成你的日誌輸出函式。