追踪 Go 函数调用链
- 利用 defer 实现函数出入口的跟踪
func Trace() func() {
pc, _, _, ok := runtime.Caller(1)
if !ok {
panic("not found caller")
}
fn := runtime.FuncForPC(pc)
name := fn.Name()
fmt.Printf("enter: %s\n", name)
return func() { fmt.Printf("exit: %s\n", name) }
}
-
利用
go build tags
添加 trace 开关 -
解析 Go 源码为 AST,向 AST 的所有函数声明中注入 Trace() 函数
- 克隆源码
git clone https://github.com/myyppp/functrace.git
- 编译
cd ./cmd/gen
go build -tags trace .
gen [-w] xxx.go // -w:写入源文件