动机:我不能让google cpu profiler在代码运行的机器上工作(我的最后一口气我诅咒libunwind :)),所以我想知道gdb是否支持高频随机暂停程序执行,存储名称函数中断发生的次数并计算它在函数x中暂停的次数。 这就是我所谓的“运行时采样”,可能更精确/更智能的名称。 我查看了oprofile,但它很复杂到a)弄清楚它是否可以做到这一点b)弄清楚如何去做 编辑:显然正确的名称是: “统计抽样方法”
EDIT2:为什么我为此提供赏金的原因是我在SO上看到一些人推荐手动中断10-20x并用bt检查堆栈...
在时间上看起来非常浪费,所以我猜测一些聪明的人自动化它。 :)
EDIT3:gprof不会削减它...我最近在ARM系统上尝试运行它并且输出是垃圾...... :(我猜它多线程的麻烦就是这个原因......
答案 0 :(得分:3)
您可以在运行时暂停GDB中的手动采样。
您认为自己想要的是gprof,但是 如果你的目标是让程序尽可能快,那么我会建议
高频率的采样没有帮助。
计算程序计数器在函数X中的样本数量除了人为的小程序外没有用。
如果您按照该链接进行操作,则会看到原因,并说明如何成功完成此操作。
答案 1 :(得分:3)
GDB不会做得这么好,虽然你肯定会破解一些产生非常不准确结果的东西。
我建议Valgrind的“Callgrind”插件。作为奖励,它绝对不需要重新编译或其他特殊设置。您只需要在系统中安装valgrind,并在程序中调试信息(或者,至少是完整的符号信息;我不确定)。
然后你调用你的程序:
valgrind --tool=callgrind <your program command line>
完成后,当前目录中将有一个文件名callgrind.out.<pid>
。您可以使用名为kcachegrind
的非常好的GUI工具来阅读和可视化此文件(通常您必须单独安装)。
唯一的问题是,因为callgrind稍微减慢了程序的执行速度,所以在系统调用中花费的时间可能比实际上要小(以百分比表示)。默认情况下,callgrind在其计数器中不包含系统时间,因此它给出的值是程序中代码的真实比较,如果不是该函数下的实际时间。这可能会让人感到困惑,所以如果发生这种情况,请尝试添加--collect-systime=yes
。
我不确定ARM上的callgrind状态是什么。 ARMv7是listed as a supported platform,但只是表示“相当完整”,无论这意味着什么。