go程序发生异常时如何打印堆栈信息
下面函数仅供参考,当发生异常时可以打印出出错的文件,代码行号,以及堆栈,方便排查错误。
defer func() {
if err := recover(); err != nil {
utils.CheckErr(utils.Panic2Error(err), 2)
}
}()
// CheckErr 错误处理函数,程序中错误分2种,一种需要终止程序,一种仅仅是记录错误日志 flag: 1:exit 2:log only
func CheckErr(err error, flag int) {
defer func() {
fmt.println("error.")
}()
var path string
if err != nil {
_, file, line, _ := runtime.Caller(1)
path = " -- " + file + ":" + strconv.Itoa(line)
switch flag {
case CHECK_FLAG_EXIT:
clog.Critical(err.Error() + path)
clog.Critical(StackTrace(false))
panic(err)
case CHECK_FLAG_LOGONLY:
clog.Critical(err.Error() + path)
clog.Critical(StackTrace(false))
default:
clog.Info(err.Error() + path)
}
}
}
func StackTrace(all bool) string {
// Reserve 10K buffer at first
buf := make([]byte, 10240)
for {
size := runtime.Stack(buf, all)
// The size of the buffer may be not enough to hold the stacktrace,
// so double the buffer size
if size == len(buf) {
buf = make([]byte, len(buf)<<1)
continue
}
break
}
return string(buf)
}