GoCollections/exceptions/StackTrace.go

66 lines
1.2 KiB
Go
Raw Normal View History

2021-05-20 17:32:35 +08:00
package exceptions
import (
"fmt"
"io"
"runtime"
2021-05-21 11:14:07 +08:00
"strings"
2021-05-20 17:32:35 +08:00
)
type StackTrace struct {
pc uintptr
file string
line int
}
func (s StackTrace) Pc() uintptr {
return s.pc
}
func (s StackTrace) File() string {
return s.file
}
func (s StackTrace) Line() int {
return s.line
}
func (s StackTrace) Print(writer io.Writer) {
_, err := fmt.Fprint(writer, "at", s.file, s.line)
if err != nil {
return
}
}
func (s StackTrace) PrintLn(writer io.Writer) {
_, err := fmt.Fprintf(writer, "\tat %s(%d)\n", s.file, s.line)
if err != nil {
return
}
}
2021-05-21 11:14:07 +08:00
func (s StackTrace) WriteTo(builder *strings.Builder) {
builder.WriteString(fmt.Sprintf("\tat %s(%d)\n", s.file, s.line))
}
2021-05-20 17:32:35 +08:00
func GetStackTrace() []StackTrace {
stackTraceMax := 16
stackTraceUsed := 0
stackTrace := make([]StackTrace, stackTraceMax)
for i := 1; ; i++ {
pc, file, line, ok := runtime.Caller(i)
if !ok {
break
}
if stackTraceUsed == stackTraceMax {
stackTraceMax *= 2
stackTraceOld := stackTrace
stackTrace = make([]StackTrace, stackTraceMax)
copy(stackTrace, stackTraceOld)
}
stackTrace[stackTraceUsed] = StackTrace{pc, file, line}
stackTraceUsed++
}
return stackTrace[0:stackTraceUsed]
}