61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package slog
|
|
|
|
import (
|
|
"runtime"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
func getTraceback() *MethodTraceback {
|
|
caller, _, _, _ := runtime.Caller(5)
|
|
details := runtime.FuncForPC(caller)
|
|
signature := details.Name()
|
|
path, line := details.FileLine(caller)
|
|
splitPath := strings.Split(path, "/")
|
|
|
|
splitSignature := strings.Split(signature, ".")
|
|
method := splitSignature[len(splitSignature)-1]
|
|
|
|
tb := &MethodTraceback{
|
|
Filename: splitPath[len(splitPath)-1],
|
|
FullPath: path,
|
|
Line: line,
|
|
Signature: signature,
|
|
Method: method,
|
|
}
|
|
|
|
return tb
|
|
}
|
|
func getFullTraceback(skip int) []*MethodTraceback {
|
|
pc := make([]uintptr, 15)
|
|
runtime.Callers(skip, pc)
|
|
list := make([]*MethodTraceback, 0)
|
|
frames := runtime.CallersFrames(pc)
|
|
for {
|
|
frame, more := frames.Next()
|
|
if !more {
|
|
break
|
|
}
|
|
details := runtime.FuncForPC(frame.PC)
|
|
signature := details.Name()
|
|
path, line := details.FileLine(frame.PC)
|
|
splitPath := strings.Split(path, "/")
|
|
|
|
splitSignature := strings.Split(signature, ".")
|
|
method := splitSignature[len(splitSignature)-1]
|
|
|
|
tb := &MethodTraceback{
|
|
Filename: splitPath[len(splitPath)-1],
|
|
FullPath: path,
|
|
Line: line,
|
|
Signature: signature,
|
|
Method: method,
|
|
}
|
|
list = append(list, tb)
|
|
}
|
|
sort.Slice(list, func(i, j int) bool {
|
|
return j < i
|
|
})
|
|
return list
|
|
}
|