golang - 패닉 발생 시 stack trace 출력

아래 코드는 어떤 오픈 소스에서 본 것을 아주 약간 변경한 것이다.
보기 좋게 출력하기 위해 go-spew 라는 오픈 소스 라이브러리를 사용하였다.

import (
 "fmt"
 "runtime"

 "github.com/davecgh/go-spew/spew"
)

func PrintPanicStack(extras ...interface{}) {
 if x := recover(); x != nil {
  fmt.Println("%v", x)

  i := 0
  funcName, file, line, ok := runtime.Caller(i)

  for ok {
   fmt.Println("PrintPanicStack. [func]: %s, [file]: %s, [line]: %d\n", runtime.FuncForPC(funcName).Name(), file, line)
   i++
   funcName, file, line, ok = runtime.Caller(i)
  }

  for k := range extras {
   fmt.Println("EXRAS#%v DATA:%v\n", k, spew.Sdump(extras[k]))   
  }
 }
}
func _handle() {
 defer PrintPanicStack()

 ...	
}

이 글은 2019-01-29에 작성되었습니다.