我一直在寻找Linux采样分析器,callgrind最接近显示有用的结果。但是,开销估计为20--100x slower than normal。另外,我只对每个函数花费的时间感兴趣(特别强调阻止read()
和write()
等调用,其他任何分析器都不会忠实地显示这些调用。
答案 0 :(得分:1)
3)Callgrind就像动态翻译一样工作,它使用计数仪器代码检测原始代码。对代码中的每个存储器访问指令(用于高速缓存模拟)进行检测,并且(我建议)对每个跟踪执行的类似jmp的指令进行检测。每个基本块的计数。
我有一个小型采样分析器,就像调试器一样;它确实将setitimer()
分析计数器注入到应用程序中,然后它拦截所有SIGALRM并打印当前$eip
值。
之前有一些采样{@ 1}}方法的采样分析器,也有类似的profil()
。这由setitimer
和glibc/gmon/gmon.c
使用(确切地说,由gprof -p
使用)。 gcc -pg
函数能够分析单个连续代码片段,每1或10毫秒采样一次虚拟CPU时间。还有sprofil()
功能。
还检查LD_PRELOAD = / lib / libpcprofile.so PCPROFILE_OUTPUT = output.file - 但我不知道它是否有效或如何工作
编号问题:
2)“Callgrind是Cachegrind的扩展。它提供了Cachegrind所做的所有信息,以及有关调用图的额外信息。” - 因此它可以提供cachegrind中的任何内容,但它也允许用户关闭缓存模拟:profil()
(这是默认值)
速度:根据http://www.valgrind.org/docs/manual/nl-manual.html - Nul valgrind工具(又名nulgrind)的手册,没有额外的仪器,减速是5倍。这是因为程序是由valgrind本身动态翻译的。因此,valgrind可能没有工具,它可以比nulgrind更快地工作。
答案 1 :(得分:0)
你试过gprof吗?它不像valgrind那样有很大的开销。
答案 2 :(得分:0)
尝试使用RotateRight中的Zoom。它具有“线程时间”配置,可以对单个进程中的所有线程进行采样,无论它们是在运行还是阻塞。