版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfengdiandia/article/details/80058805
一. 缘起
- 程序进程后台运行
- 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
替换成你的日志输出函数。