github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/errors/p2pcallstack.go (about) 1 package errors 2 3 import ( 4 "bytes" 5 "fmt" 6 "runtime" 7 ) 8 9 type CallStacker interface { 10 GetCallStack() *CallStack 11 } 12 13 type CallStack struct { 14 Stacks []uintptr 15 } 16 17 func GetCallStacks(err error) *CallStack { 18 if err, ok := err.(CallStacker); ok { 19 return err.GetCallStack() 20 } 21 return nil 22 } 23 24 func CallStacksString(call *CallStack) string { 25 buf := bytes.Buffer{} 26 if call == nil { 27 return fmt.Sprintf("No call stack available") 28 } 29 30 for _, stack := range call.Stacks { 31 f := runtime.FuncForPC(stack) 32 file, line := f.FileLine(stack) 33 buf.WriteString(fmt.Sprintf("%s:%d - %s\n", file, line, f.Name())) 34 } 35 36 return fmt.Sprintf("%s", buf.Bytes()) 37 } 38 39 func getCallStack(skip int, depth int) *CallStack { 40 stacks := make([]uintptr, depth) 41 stacklen := runtime.Callers(skip, stacks) 42 43 return &CallStack{ 44 Stacks: stacks[:stacklen], 45 } 46 }