【问题标题】:How to make go trace show every func call?如何让 go trace 显示每个 func 调用?
【发布时间】:2022-11-28 12:49:48
【问题描述】:

我正在尝试使用 go tool trace 获取调用树,但它仅显示前 80 个函数并且似乎不支持 pprof 的标志,如 --nodecount 等。如何让跟踪显示所有节点?如果 trace 不是为此设计的,那么无论函数的执行时间如何,我如何才能获得完整的调用树,因为如果运行时间不够长 pprof 可能会错过它?

【问题讨论】:

  • trace的主要目标不是做一个调用图,它的主要目标是性能提升相关。您可能会发现 github.com/ofabry/go-callvis 很有用,它使用静态代码分析来制作调用图
  • 谢谢,这似乎是一个合理的解决方案,但它会构建一个包含所有可能选项的树,这对我来说太过分了。我需要一棵完整的树,但对于特定场景,是否有可能或不需要工具?
  • 你可以要求 go-callvis 限制它用参数绘制的内容。没有适合这项工作的标准 go 工具。 pprof 和 trace 最终用于性能优化和运行时分析。恐怕你必须研究第三方项目才能得到你想要的东西。我想更多的程序员对性能比文档更感兴趣 :)

标签: go backtrace pprof


【解决方案1】:

go-callvis 可以检查,因为它使用来自调用图的数据及其与包和类型的关系提供了 Go 程序的非常高级的概述。

通常它会运行一个 pointer analysis 来构建程序的调用图,并使用数据生成点格式的输出,可以使用 Graphviz 工具进行渲染。高级概述如下。

参考:https://github.com/ofabry/go-callvis

【讨论】:

    【解决方案2】:

    要显示每个函数调用,您必须在代码中添加检测。

    https://github.com/jbardin/gotrace 自动执行此操作。

            files := []string{}
            e = filepath.Walk(copysrcdir, func(path string, info os.FileInfo, err error) error {
                if mioutil.IsRegularFile(path) && filepath.Ext(path) == ".go" {
                    files = append(files, path)
                }
                return nil
            })
            errs.PanicOnError(e)
    
            var wg sync.WaitGroup
            for _, file := range files {
                wg.Add(1)
                go func(file string) {
                    defer wg.Done()
                    log.Println("adding trace to " + file)
                    cmd := exec.Command("gotrace", "-w", "-timing", "-returns", file)
                    e = cmd.Run()
                    errs.PanicOnError(e)
                }(file)
            }
            wg.Wait()
    
    

    然后,您使用仪器编译代码并使用该二进制文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2022-01-09
      • 2018-03-21
      • 2014-01-02
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多