GoCollections/lang/StackTrace.go

67 lines
1.2 KiB
Go
Raw Normal View History

2022-11-25 18:19:33 +08:00
/*
* Copyright (c) 2022 tursom. All rights reserved.
* Use of this source code is governed by a GPL-3
* license that can be found in the LICENSE file.
*/
2022-11-26 13:42:30 +08:00
package lang
2021-05-20 17:32:35 +08:00
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 {
2022-03-21 11:02:41 +08:00
return GetStackTraceSkipDeep(0)
}
func GetStackTraceSkipDeep(deep int) []StackTrace {
stackTrace := make([]StackTrace, 0, 16)
for i := deep + 1; ; i++ {
2021-05-20 17:32:35 +08:00
pc, file, line, ok := runtime.Caller(i)
if !ok {
break
}
2022-03-21 11:02:41 +08:00
stackTrace = append(stackTrace, StackTrace{pc, file, line})
2021-05-20 17:32:35 +08:00
}
2022-03-21 11:02:41 +08:00
return stackTrace
2021-05-20 17:32:35 +08:00
}