我一直在寻找Linux采样探查器,而callgrind最接近显示有用的结果。但是,开销估计为20--100x slower than normal。此外,我只对每个函数所花费的时间感兴趣(特别强调阻止诸如read()
和write()
之类的调用,其他任何探查器都不会如实显示这些调用)。
最佳答案
3)Callgrind像动态转换器一样工作,它使用计数仪器代码来检测原始代码。对代码中的每个内存访问指令(用于高速缓存模拟)和(建议)每条类似于jmp的指令(用于跟踪exec)进行检测。每个基本块的数量。
我有一个小型的采样探查器,其作用类似于调试器。它的确向应用程序中注入(inject)了setitimer()
配置计数器,然后拦截了所有SIGALRM并打印了当前的$eip
值。
之前有一些使用setitimer
方法的采样探查器,对于类似的东西也有一个 profil()
。这由glibc/gmon/gmon.c
和gprof -p
(确切地说,由gcc -pg
)使用。 profil()
函数能够通过每1或10毫秒采样一次虚拟cpu时间来分析单个连续代码片段。还有 sprofil()
函数。
还检查LD_PRELOAD =/lib/libpcprofile.so PCPROFILE_OUTPUT = output.file-但我不知道它的工作方式或工作方式
对于编号的问题:
2)“Callgrind是Cachegrind的扩展。它提供Cachegrind所做的所有信息,以及有关调用图的其他信息。” -因此,它可以提供cachegrind中的所有内容,但也允许用户关闭缓存模拟:--simulate-cache=no
(默认值)
为了提高速度:根据http://www.valgrind.org/docs/manual/nl-manual.html-Nul valgrind工具(又名nulgrind)的手册,该工具不需要任何其他工具,减速速度是5倍。这是因为程序是由valgrind本身动态翻译的。因此,没有适用于valgrind的工具,它可以比nulgrind更快地工作。
关于c - 使用callgrind作为采样探查器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3682312/