3) Callgrind 就像动态翻译器一样工作,它使用计数仪器代码来检测原始代码。对代码中的每条内存访问指令(用于缓存模拟)和(我建议)对每条类似 jmp 的指令进行检测以跟踪 exec。每个基本块的计数。
我有一个小型采样分析器,它的作用就像调试器;它确实将一个setitimer()
分析计数器注入应用程序,然后它会拦截所有 SIGALRM 并打印当前$eip
值。
之前有一些采样分析器的setitimer
方法,也有profil()
类似的方法。由glibc/gmon/gmon.c
and使用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 更快地工作。