如何停止 go 配置文件隐藏 JIT 代码的 PC 地址?

问题描述 投票:0回答:0

背景

我有一个用 Go 编写的模拟器。为了更快的速度,我在模拟器中生成机器代码并执行它。我知道我生成的机器码的地址和源代码。

问题

如何分析生成的代码?

我试过什么

  1. 我在运行程序时生成了一个 cpu 配置文件(使用普通的 pprof.StartCPUProfile 函数)
  2. 我已经使用 protobuf 将配置文件读回内存。
  3. 然后我可以修改配置文件样本,为它们提供新的更有意义的位置,然后写回配置文件
  4. 然后我可以像往常一样使用 go tool pprof

但是,这种方法不起作用,因为如果探查器本身不能给它一个有意义的名称,PC 位置似乎会被覆盖。

这意味着所有命中 JIT 代码的分析样本都被赋予相同的 PC 位置(运行时._ExternalCode)。

我在运行时找到了发生这种情况的地方:https://github.com/golang/go/blob/master/src/runtime/proc.go 的第 4799 行:

    if inVDSOPage(pc) {
        pc = abi.FuncPCABIInternal(_VDSO) + sys.PCQuantum
    } else if pc > firstmoduledata.etext {
        // "ExternalCode" is better than "etext".
        pc = abi.FuncPCABIInternal(_ExternalCode) + sys.PCQuantum
    }
    stk[0] = pc

但是修改这个运行时代码感觉不可移植,不知道有没有更好的办法?

例如,也许有一种方法可以告诉 Go 分析器有关运行时代码的其他部分?或者也许有一种定期轮询 PC 地址并自己生成配置文件的方法? (我在 Linux 上,所以可以读取 /proc 文件或使用 perf 吗?)

go profiling
© www.soinside.com 2019 - 2024. All rights reserved.