需求一般是获取调用函数的栈帧信息,如函数本身及上层调用者函数名,所在文件,行号等。
关键函数:
runtime.Caller() 获取函数调用栈的某一层栈帧信息
runtime.Callers() 获取函数调用栈的若干层栈帧信息
这两个函数的入参skip在意思上有差异,详细参看源码注释
示意代码:
https://play.studygolang.com/p/Th8vauToCrg
package main
import (
"fmt"
"runtime"
)
func A() {
fmt.Println("aaa")
B()
}
func B() {
fmt.Println("bbb")
pcs := make([]uintptr,20)
n := runtime.Callers(1, pcs)
println(n)
frames := runtime.CallersFrames(pcs[:n])
for frame, exist := frames.Next();exist;frame, exist = frames.Next(){
if !exist {
break
}
fmt.Printf("%s %d %s\n",frame.File,frame.Line,frame.Function)
}
}
func main() {
pc, file, line, ok := runtime.Caller(0)
f := runtime.FuncForPC(pc)
fmt.Println(pc, file,line,ok,f.Name())
A()
}版权声明:本文为qzoscar91原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。