如何在Linux上分析multithreadingC ++应用程序?

我曾经用gprof来完成我所有的Linux分析。

但是,对于我的multithreading应用程序,它的输出看起来不一致。

现在,我挖了这个:

http://sam.zoy.org/writings/programming/gprof.html

但是,从很久以前,在我的gprof输出中,似乎我的gprof列出了非主线程使用的函数。

所以,我的问题是:

1)2010年,我可以轻松使用gprof来分析multithreadingLinux C ++应用程序吗? ( Ubuntu 9.10 )2)我应该考虑哪些其他工具来进行性能分析?

编辑:在穷人的分析器上添加了另一个答案 ,恕我直言,multithreading应用程序更好。

看看oprofile 。 这个工具的分析开销是微不足道的,它支持multithreading应用程序—只要你不想剖析互斥争用(这是分析multithreading应用程序非常重要的一部分)

Paul R说,看看Zoom。 与gprof相比,您也可以使用lsstack ,这是一种低技术方法,但是效果惊人。

补充:既然你澄清说你在33ms运行OpenGL,我的先前的build议站立。 另外,我个人在这样的情况下所做的是既有效又不直观。 只是让它运行一个典型的或有问题的工作负载,只是停下来,手动,在其轨道,看看它在做什么,为什么。 多次这样做。 现在,如果它只是偶尔行为不当,那么只有在行为不当的时候才会停下来。 这并不容易,但是我已经使用了闹钟中断来设置正确的延迟。 例如,如果100帧中的一帧超过33ms,则在帧开始时,将计时器设置为35ms,在帧结束时将其closures。 这样,它只会在代码耗时太长时才中断,而且会告诉你为什么。 当然,一个样本可能会错过有罪的代码,但20个样本不会错过它。

看看Valgrind 。

看看Zoom 。

看看穷人的分析器 。 令人惊讶的是,对于multithreading应用程序同时进行CPU概要分析和互斥锁争用分析,还有其他几个工具,而PMP同时执行这两个工具,甚至不需要安装任何东西(只要你有gdb)。

您可以随机运行pstack来查找给定点的堆栈。 例如10或20次。 最典型的堆栈是应用程序花费大部分时间的地方(根据经验,我们可以假设帕累托分布)。

您可以将这些知识与stracetruss (Solaris)结合起来以跟踪系统调用,并将pmap用于内存打印。

如果应用程序在专用系统上运行,那么您也可以通过测量CPU,内存,I / O等来分析整个系统。

尝试现代Linux分析工具, perf (perf_events): https ://perf.wiki.kernel.org/index.php/Tutorial和http://www.brendangregg.com/perf.html

 perf record ./application # generates profile file perf.data perf report 

既然你没有提到非商业,我可以build议英特尔的VTune。 这不是免费的,但细节的水平是非常可观的(和开销是微不足道的)。