精简版:
是否有适合Linux的基于良好时间的采样分析器?
长版:
我通常使用OProfile来优化我的应用程序.我最近发现了一个令我疑惑的缺点.
问题是紧密循环,产生c ++ filt来解码c ++名称.在追逐另一个瓶颈时,我偶然偶然发现了代码.OProfile没有显示代码的任何异常,所以我几乎忽略了它,但我的代码意识告诉我优化调用,看看发生了什么.我将popenc ++ filt 更改为abi::__cxa_demangle.运行时间从一分多钟到一秒多一点.大约x60加速.
有没有办法我可以配置OProfile标记popen呼叫?随着配置文件数据的出现,现在OProfile认为瓶颈是堆和std::string调用(BTW一旦优化就将运行时间降低到不到一秒,超过x2加速).
这是我的OProfile配置:
$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536
Run Code Online (Sandbox Code Playgroud)
还有另一个Linux的分析器可能找到了瓶颈吗?
我怀疑问题是OProfile只将其样本记录到当前正在运行的进程中.我希望它始终将其样本记录到我正在分析的过程中.因此,如果当前流程已被切换(阻止IO或popen呼叫),OProfile只会将其样本置于阻塞的呼叫中.
如果我无法修复此问题,OProfile仅在可执行文件接近100%CPU时才有用.它对于具有低效阻塞调用的可执行文件无能为力.
我很好奇的人是否具有性能测试库和前端,将产生良好的图形图表用于C++(如对gcov是如何产生的覆盖数据,并有前端那里查看代码覆盖率数据)的任何建议.能够生成如下图表:
会非常漂亮.我们现在使用cppunit进行单元测试,所以也许有一些东西可以与之集成.
更多信息:我们正在Linux(我们在Intel x86-64机器上使用Ubuntu Lucid/Maverick)进行编译.
使用以下工具:
我开始使用此工具并尝试找到最佳组合,示例以充分利用分析.
谢谢
我不确定我的问题标题是否正确,所以要解释我的意思,请考虑以下示例:
我用它创建一个QApplication和一个.然后我将一个处理程序附加到按钮上的点击信号,如下所示:QWidgetQPushButton
void MyWidget::on_pushButton_clicked(){
//Never return
while(true);
}
Run Code Online (Sandbox Code Playgroud)
最后,我启动应用程序的事件循环,当我运行程序并显示窗口时单击按钮.
在我的情况下,这将停止整个应用程序.所以我现在的问题是如何从代码中"检测"我的应用程序中发生了这种挂断?
我知道编写在信号处理程序中没有返回的代码是不好的做法,我问这个问题是因为我想检测错误并从中恢复,可能是通过重新启动应用程序来努力提高生产时的弹性.
谢谢!
我正在尝试对支持不佳的原型嵌入式平台进行一些性能分析.
我注意到GCC的-pg标志导致__gnu_mcount_nc在每个函数的入口处插入thunk .没有__gnu_mcount_nc可用的实现(并且供应商对协助不感兴趣),但是因为编写一个简单记录堆栈帧和当前循环计数的操作是微不足道的,所以我已经这样做了; 这工作正常,并且在调用者/被调用者图和最常被称为函数方面产生有用的结果.
我真的想获得有关在函数体中花费的时间的信息,但是我很难理解如何只使用条目而不是退出来解决这个问题,每个函数都被钩住了:你可以确切地知道每个函数的确切时间输入,但没有挂钩退出点,你不知道多少时间,直到你收到下一条信息属于被叫者和呼叫者多少.
尽管如此,GNU概要分析工具实际上可以在许多平台上收集函数的运行时信息,因此可能开发人员在实现这一目标时需要考虑一些方案.
我已经看到一些现有的实现,它们执行诸如维护阴影调用堆栈并将入口处的返回地址旋转到__gnu_mcount_nc,以便在被调用者返回时再次调用__gnu_mcount_nc; 然后,它可以将调用者/被调用者/ sp三元组与影子调用堆栈的顶部进行匹配,从而将此案例与条目调用区分开来,记录退出时间并正确返回调用者.
这种方法还有很多不足之处:
是否有一些明显更好的方法来实现__gnu_mcount_nc,以便-pg构建能够捕获函数退出以及我缺少的入口时间?