github.com/tursom/GoCollections@v0.3.10/lang/StackTrace.go (about) 1 /* 2 * Copyright (c) 2022 tursom. All rights reserved. 3 * Use of this source code is governed by a GPL-3 4 * license that can be found in the LICENSE file. 5 */ 6 7 package lang 8 9 import ( 10 "fmt" 11 "io" 12 "runtime" 13 "strings" 14 ) 15 16 type StackTrace struct { 17 pc uintptr 18 file string 19 line int 20 } 21 22 func (s StackTrace) Pc() uintptr { 23 return s.pc 24 } 25 26 func (s StackTrace) File() string { 27 return s.file 28 } 29 30 func (s StackTrace) Line() int { 31 return s.line 32 } 33 34 func (s StackTrace) Print(writer io.Writer) { 35 _, err := fmt.Fprint(writer, "at", s.file, s.line) 36 if err != nil { 37 return 38 } 39 } 40 41 func (s StackTrace) PrintLn(writer io.Writer) { 42 _, err := fmt.Fprintf(writer, "\tat %s(%d)\n", s.file, s.line) 43 if err != nil { 44 return 45 } 46 } 47 48 func (s StackTrace) WriteTo(builder *strings.Builder) { 49 builder.WriteString(fmt.Sprintf("\tat %s(%d)\n", s.file, s.line)) 50 } 51 52 func GetStackTrace() []StackTrace { 53 return GetStackTraceSkipDeep(0) 54 } 55 56 func GetStackTraceSkipDeep(deep int) []StackTrace { 57 stackTrace := make([]StackTrace, 0, 16) 58 for i := deep + 1; ; i++ { 59 pc, file, line, ok := runtime.Caller(i) 60 if !ok { 61 break 62 } 63 stackTrace = append(stackTrace, StackTrace{pc, file, line}) 64 } 65 return stackTrace 66 }