我曾经使用gprof进行所有Linux分析。
但是,使用我的多线程应用程序时,它的输出似乎不一致。
现在,我把它挖出来了:
http://sam.zoy.org/writings/programming/gprof.html
然而,从很久以前开始,在我的gprof输出中,看来我的gprof列出了非主线程使用的函数。
所以,我的问题是:
1)2010年,我可以轻松使用gprof来分析多线程Linux C ++应用程序吗? (Ubuntu 9.10) 2)我应该研究哪些其他工具进行分析?
答案 0 :(得分:12)
编辑:在穷人的探查器上添加了另一个answer,恕我直言更适合多线程应用。
看看oprofile。此工具的分析开销可以忽略不计,它支持多线程应用程序---只要您不想分析互斥争用(这是分析多线程应用程序的一个非常重要的部分)
答案 1 :(得分:7)
看看poor man's profiler。令人惊讶的是,很少有其他工具可供多线程应用程序同时执行CPU分析和互斥争用分析,而PMP同时执行这两项工作,甚至不需要安装任何东西(只要你有gdb)。
答案 2 :(得分:6)
查看Valgrind。
答案 3 :(得分:6)
查看Zoom。
答案 4 :(得分:6)
补充:由于您澄清了您在33毫秒运行OpenGL,我之前的建议是有效的。此外,我个人在这种情况下所做的事情既有效又不直观。只需让它与典型或有问题的工作负载一起运行,然后手动停止它,并查看它正在做什么以及为什么。这样做几次。 现在,如果只是偶尔行为不端,你只想在它行为不端的时候停止它。这并不容易,但我已经使用闹钟中断设置来实现正确的延迟。例如,如果100帧中的一帧超过33毫秒,则在帧开始时将计时器设置为35毫秒,在帧结束时将其关闭。这样,它只会在代码耗时太长时才会中断,它会显示原因。当然,一个样本可能会错过有罪的代码,但是20个样本不会错过它。
答案 5 :(得分:3)
尝试使用现代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
答案 6 :(得分:0)
您可以随机运行 pstack 以查找给定点的堆栈。例如。 10或20次。 最典型的堆栈是应用程序大部分时间花费的时间(根据经验,我们可以假设帕累托分布)。
您可以将这些知识与 strace 或 truss (Solaris)相结合以跟踪系统调用,并将 pmap 与内存打印相结合。
如果应用程序在专用系统上运行,您还可以 sar 来测量cpu,内存,i / o等,以分析整个系统。
答案 7 :(得分:0)
由于您没有提及非商业性,我可以建议英特尔的VTune。它不是免费的,但细节水平非常令人印象深刻(开销可以忽略不计)。
答案 8 :(得分:0)
Microprofile是对此的另一个可能答案。它需要手工编写代码,但似乎可以很好地处理多线程代码。它还具有用于分析图形管道的特殊钩子,包括卡本身内部发生的事情。
答案 9 :(得分:0)
在问题上稍有不同,您实际上可以对使用ftrace和kernelshark的多线程应用程序中发生的事情有一个很好的了解。收集正确的跟踪并按下正确的按钮,您可以看到各个线程的调度。
根据发行版的内核,您可能必须构建具有正确配置的内核(但我认为现在很多人已经构建了它)。
答案 10 :(得分:0)
我尝试了 valgrind 和 gprof 。令人遗憾的是,它们都不适合多线程应用程序。后来,我找到了 Intel VTune Amplifier 。好消息是,它可以很好地处理多线程,可以与大多数主要语言一起使用,可以在Windows和Linux上运行,并且具有许多出色的分析功能。此外,应用程序本身是免费的。但是,它仅适用于Intel处理器。