用_gnu_mcount_nc捕获函数退出时间
我试图在一个不受支持的原型嵌入式平台上进行一些性能分析。
我注意到GCC的-pg旗导致了__gnu_mcount_nc
在输入到每个函数时插入。没有执行__gnu_mcount_nc
是可用的(供应商对协助不感兴趣),但是,由于编写一个只记录堆栈帧和当前循环计数的程序非常简单,我已经这样做了;这样做很好,并且在调用者/被调用方图和最常被称为函数的情况下产生了有用的结果。
我真的很想获得关于在函数体中花费的时间的信息,但是我很难理解如何仅用入口(而不是出口)来处理每个函数的连接:您可以准确地知道每个函数何时输入,但如果不将退出点挂钩,您就无法知道在收到下一个被调用者的信息之前有多少时间,以及调用方需要多少时间。
尽管如此,GNU分析工具实际上确实能够为许多平台上的功能收集运行时信息,因此,开发人员想必有一些实现这一目标的方案。
我已经看到了一些现有的实现,比如维护影子调用堆栈,并在进入_gnu_mcount_nc时旋转返回地址,以便在被调用方返回时再次调用_gnu_mcount_nc;然后它可以将调用者/callee/sp三元组与影子调用堆栈的顶部相匹配,从而在输入时将此情况与调用区分开来,记录退出时间并正确返回给调用方。
这一办法还有许多有待改进的地方:
- 在没有-pg标志的递归和库的存在下,它似乎很脆弱。
- 在缺乏工具链tls支持且当前线程ID可能很昂贵/复杂的嵌入式多线程/多核环境中,似乎很难在低开销的情况下实现。
有什么明显的更好的方法来实现a_gnu_mcount_nc,以便-pg构建能够捕获函数退出以及我所缺少的入口时间?