3

我一直在寻找 Linux 采样分析器,而callgrind最接近显示有用的结果。然而,开销估计比正常慢 20--100 倍。此外,我只对每个函数花费的时间感兴趣(特别强调阻塞调用,例如read()and write(),其他分析器不会忠实地显示)。

  1. 有没有办法关闭多余的选项,以便只记录最小数据以生成在各种调用堆栈中花费的时间?
  2. callgrind 的 cachegrind 遗产是否意味着在缓存分析等方面正在做多余的事情?
  3. 我假设 callgrind 像调试器一样运行。是否可以对其进行调整以每隔一段时间而不是每条指令对过程进行采样?
4

3 回答 3

2

3) Callgrind 就像动态翻译器一样工作,它使用计数仪器代码来检测原始代码。对代码中的每条内存访问指令(用于缓存模拟)和(我建议)对每条类似 jmp 的指令进行检测以跟踪 exec。每个基本块的计数。

我有一个小型采样分析器,它的作用就像调试器;它确实将一个setitimer()分析计数器注入应用程序,然后它会拦截所有 SIGALRM 并打印当前$eip值。

之前有一些采样分析器的setitimer方法,也有profil()类似的方法。由glibc/gmon/gmon.cand使用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 更快地工作。

于 2011-05-11T15:36:34.260 回答
0

尝试使用RotateRight 中的缩放。它有一个“线程时间”配置,可以对单个进程中的所有线程进行采样,无论它们是运行还是阻塞。

于 2012-09-04T20:01:37.613 回答
0

你试过 gprof 吗?它没有 valgrind 那样的大开销。

于 2010-09-10T04:53:34.213 回答