如下所示:
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,....
返回值:
pc是uintptr这个返回的是函数指针
file是函数所在文件名目录
line所在行号
ok 是否可以获取到信息
示例:
我们分别打印skip为0-3的相关信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package main
import (
"fmt"
"runtime"
)
func main() {
for i := 0 ; i< 4; i++ {
test(i)
}
}
func test(skip int) {
call(skip)
}
func call(skip int) {
pc,file,line,ok := runtime.Caller(skip)
pcName := runtime.FuncForPC(pc).Name() //获取函数名
fmt.Println(fmt.Sprintf("%v %s %d %t %s",pc,file,line,ok,pcName))
}
|
结果:
1
2
3
4
|
4887700 D:/GoProject/src /test/test5.go 19 true main.call
4887585 D:/GoProject/src/ test/test5.go 15 true main.test
4887481 D:/GoProject/src /test/test5.go 10 true main.main
4383501 C:/Go/src/runtime/proc.go 198 true runtime.main
|
分析结果可以看到
0-3分别上当前函数,当前函数的上一个caller,....
补充:golang打印所有的runtime调用栈
我就废话不多说了,大家还是直接看代码吧~
1
2
3
4
|
import "runtime"
buf := make([]byte, 1 << 20)
runtime.Stack(buf, true)
fmt.Printf("\n%s", buf)
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://skaygo.blog.csdn.net/article/details/100042494