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  }