github.com/vmware/transport-go@v1.3.4/plank/utils/runtime.go (about) 1 // Copyright 2019-2021 VMware, Inc. 2 // SPDX-License-Identifier: BSD-2-Clause 3 4 package utils 5 6 import ( 7 "runtime" 8 "strings" 9 ) 10 11 func GetGoRoutineID() string { 12 var buf [64]byte 13 n := runtime.Stack(buf[:], false) 14 idStr := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0] 15 return idStr 16 } 17 18 func GetCurrentStackFrame() runtime.Frame { 19 return getFrame(1) 20 } 21 22 func GetCallerStackFrame() runtime.Frame { 23 return getFrame(2) 24 } 25 26 func getFrame(skipFrames int) runtime.Frame { 27 targetFrameIdx := skipFrames + 2 28 programCounters := make([]uintptr, targetFrameIdx+2) 29 n := runtime.Callers(0, programCounters) 30 frame := runtime.Frame{Function: "unknown"} 31 32 if n > 0 { 33 frames := runtime.CallersFrames(programCounters[:n]) 34 for more, frameIdx := true, 0; more && frameIdx <= targetFrameIdx; frameIdx++ { 35 var frameIdxCandidate runtime.Frame 36 frameIdxCandidate, more = frames.Next() 37 if frameIdx == targetFrameIdx { 38 frame = frameIdxCandidate 39 break 40 } 41 } 42 } 43 return frame 44 }