@@ -14,6 +14,7 @@ import (
14
14
"strings"
15
15
"sync"
16
16
17
+ pingcap "github.com/pingcap/errors"
17
18
"github.com/pkg/errors"
18
19
)
19
20
@@ -51,32 +52,62 @@ type StacktraceFrame struct {
51
52
InApp bool `json:"in_app"`
52
53
}
53
54
54
- // Try to get stacktrace from err as an interface of github.com/pkg/errors, or else NewStacktrace()
55
- func GetOrNewStacktrace (err error , skip int , context int , appPackagePrefixes []string ) * Stacktrace {
56
- stacktracer , errHasStacktrace := err .(interface {
57
- StackTrace () errors.StackTrace
58
- })
59
- if errHasStacktrace {
60
- var frames []* StacktraceFrame
61
- for f := range stacktracer .StackTrace () {
62
- pc := uintptr (f ) - 1
63
- fn := runtime .FuncForPC (pc )
64
- var fName string
65
- var file string
66
- var line int
67
- if fn != nil {
68
- file , line = fn .FileLine (pc )
69
- fName = fn .Name ()
70
- } else {
71
- file = "unknown"
72
- fName = "unknown"
73
- }
74
- frame := NewStacktraceFrame (pc , fName , file , line , context , appPackagePrefixes )
75
- if frame != nil {
76
- frames = append ([]* StacktraceFrame {frame }, frames ... )
77
- }
55
+ type pkgStacktracer interface {
56
+ StackTrace () errors.StackTrace
57
+ }
58
+
59
+ func pkgStacktrace (stacktracer pkgStacktracer , context int , appPackagePrefixes []string ) * Stacktrace {
60
+ var frames []* StacktraceFrame
61
+ for f := range stacktracer .StackTrace () {
62
+ pc := uintptr (f ) - 1
63
+ fn := runtime .FuncForPC (pc )
64
+ var fName string
65
+ var file string
66
+ var line int
67
+ if fn != nil {
68
+ file , line = fn .FileLine (pc )
69
+ fName = fn .Name ()
70
+ } else {
71
+ file = "unknown"
72
+ fName = "unknown"
73
+ }
74
+ frame := NewStacktraceFrame (pc , fName , file , line , context , appPackagePrefixes )
75
+ if frame != nil {
76
+ frames = append ([]* StacktraceFrame {frame }, frames ... )
77
+ }
78
+ }
79
+ return & Stacktrace {Frames : frames }
80
+ }
81
+
82
+ func pingcapStacktrace (stacktracer pingcap.StackTracer , context int , appPackagePrefixes []string ) * Stacktrace {
83
+ var frames []* StacktraceFrame
84
+ for f := range stacktracer .StackTrace () {
85
+ pc := uintptr (f ) - 1
86
+ fn := runtime .FuncForPC (pc )
87
+ var fName string
88
+ var file string
89
+ var line int
90
+ if fn != nil {
91
+ file , line = fn .FileLine (pc )
92
+ fName = fn .Name ()
93
+ } else {
94
+ file = "unknown"
95
+ fName = "unknown"
96
+ }
97
+ frame := NewStacktraceFrame (pc , fName , file , line , context , appPackagePrefixes )
98
+ if frame != nil {
99
+ frames = append ([]* StacktraceFrame {frame }, frames ... )
78
100
}
79
- return & Stacktrace {Frames : frames }
101
+ }
102
+ return & Stacktrace {Frames : frames }
103
+ }
104
+
105
+ // Try to get stacktrace from err as an interface of github.com/pkg/errors or github.com/pingcap/errors, or else NewStacktrace()
106
+ func GetOrNewStacktrace (err error , skip int , context int , appPackagePrefixes []string ) * Stacktrace {
107
+ if stacktracer , errHasStacktrace := err .(pkgStacktracer ); errHasStacktrace {
108
+ return pkgStacktrace (stacktracer , context , appPackagePrefixes )
109
+ } else if stacktracer , errHasStacktrace := err .(pingcap.StackTracer ); errHasStacktrace {
110
+ return pingcapStacktrace (stacktracer , context , appPackagePrefixes )
80
111
} else {
81
112
return NewStacktrace (skip + 1 , context , appPackagePrefixes )
82
113
}
0 commit comments