golang获取函数栈帧信息

需求一般是获取调用函数的栈帧信息,如函数本身及上层调用者函数名,所在文件,行号等。

关键函数:

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版权协议,转载请附上原文出处链接和本声明。