github.com/GuanceCloud/cliutils@v1.1.21/system/rtpanic/rtpanic.go (about)

     1  // Unless explicitly stated otherwise all files in this repository are licensed
     2  // under the MIT License.
     3  // This product includes software developed at Guance Cloud (https://www.guance.com/).
     4  // Copyright 2021-present Guance, Inc.
     5  
     6  // Package rtpanic wraps panic handling during golang app panic.
     7  package rtpanic
     8  
     9  import (
    10  	"runtime"
    11  )
    12  
    13  const (
    14  	StackTraceSize = 4096
    15  )
    16  
    17  type RecoverCallback func(info []byte, err error)
    18  
    19  // Recover used to hook a on-panic-function.
    20  // @RecoverCallback: 复活函数, 即如果某个 goroutine panic 后, 可以指定某个函数, 继续复活该 goroutine
    21  // @cleanupCallback: 清理/善后回调函数, 比如上报 panic 信息, 现场清理等等
    22  // TRICK: 尽量将这些回调定义成本地函数, 这样便于处理现场, 比如 recoverCallback:.
    23  func Recover(recoverCallback, cleanupCallback RecoverCallback) {
    24  	r := recover()
    25  
    26  	// 通过判断 recover() 的返回情况, 确定 goroutine 是正常退出还是被 panic 了
    27  	if err, ok := r.(error); ok {
    28  		buf := make([]byte, StackTraceSize)
    29  		runtime.Stack(buf, false)
    30  
    31  		if cleanupCallback != nil {
    32  			cleanupCallback(buf, err)
    33  		}
    34  
    35  		if recoverCallback != nil {
    36  			recoverCallback(buf, err) // 将 panic 信息回送给复活函数处理
    37  		}
    38  	}
    39  }