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  }