我有一个用 Go 编写的模拟器。为了更快的速度,我在模拟器中生成机器代码并执行它。我知道我生成的机器码的地址和源代码。
如何分析生成的代码?
但是,这种方法不起作用,因为如果探查器本身不能给它一个有意义的名称,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 吗?)