-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.go
84 lines (64 loc) · 1.49 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package errorx
import (
"github.com/go-errors/errors"
"strings"
)
func StacktraceAsArray(arg0 interface{}) []string {
traceLines := make([]string, 0)
if arg0 == nil {
return traceLines
}
var stacktrace string
switch t := arg0.(type) {
case *errors.Error:
stacktrace = t.ErrorStack()
case error:
stacktrace = errors.New(t).ErrorStack()
}
if stacktrace == "" {
return traceLines
}
stacktrace = strings.ReplaceAll(stacktrace, "\r", "")
lines := strings.Split(stacktrace, "\n")
if strings.Contains(stacktrace, "src/runtime/panic.go") {
n1 := -1
for i := 0; i < len(lines); i++ {
if i == 0 {
traceLines = append(traceLines, lines[i])
continue
}
if strings.Contains(lines[i], "src/runtime/panic.go") {
n1 = i
continue
}
if strings.Contains(lines[i], "src/runtime/proc.go") ||
strings.Contains(lines[i], "src/runtime/asm_amd64") {
break
}
if n1 < 0 || i <= n1 + 1 {
continue
}
traceLines = append(traceLines, lines[i])
}
} else {
for i := 0; i < len(lines); i++ {
if strings.Contains(lines[i], "src/runtime/proc.go") ||
strings.Contains(lines[i], "src/runtime/asm_amd64") {
break
}
traceLines = append(traceLines, lines[i])
}
}
return traceLines
}
func Stacktrace(arg0 interface{}, separator ...string) string {
sep := "\n"
if len(separator) > 0 && separator[0] != "" {
sep = separator[0]
}
lines := StacktraceAsArray(arg0)
if len(lines) < 1 {
return ""
}
return strings.Join(lines, sep)
}