2011-09-02 74 views
6

动机:我无法让谷歌cpu分析器在代码运行的机器上工作(用我最后一口气诅咒libunwind :)),所以我想知道gdb是否支持程序执行的高频随机暂停,存储发生中断的函数的名称,并计算它在函数x中暂停了多少次。 这就是我所说的“运行时间采样”,可能有更精确/更聪明的名称。 我看着oprofile的,但它是复杂的)计算出,如果能做到这一点二)弄清楚如何做到这一点 编辑:显然是正确的名称是: “统计抽样方法”GDB是否支持“运行时采样”或是否有用户“扩展”?

EDIT2 :为什么我提供了一个赏金,这是因为我看到一些脂肪酶在SO建议做手动休息10-20x和检查堆栈与Bt ... 似乎非常浪费时间,所以我觉得一些聪明的脂肪酶自动它。 :)
EDIT3:gprof不会削减它...我试图最近在ARM系统上运行它,并输出垃圾... :(我猜它与多线程的麻烦是原因...

+0

如果您还没有尝试过,手动采样似乎很浪费。请参阅第1条评论[*此处*](http://stackoverflow.com/a/893272/23771)。 [*此答案*]的最后一段(http://stackoverflow.com/a/4832698/23771)。 [*此答案。*](http://stackoverflow.com/a/317160/23771)[*此答案。*](http://stackoverflow.com/a/2474118/23771)评论[* ErikE这里*](http://stackoverflow.com/a/378024/23771)。 codelidoo评论[*这里*](http://stackoverflow.com/a/3097542/23771)。尝试一下,然后弃用它。 –

回答

2

你可以手动样品中GDB在运行时为暂停。

你似乎在想什么,你想要的是gprof,但 如果你的目标是使程序尽可能地快,那么我建议

  • 高频采样没有帮助。

  • 计数程序计数器在函数X中的样本数量除了在人工小程序中没有用处。

如果你关注那个链接,你会看到为什么成功的原因和方向。

+1

无需使用gprof标志进行编译的高频采样会很有帮助。 – rogerdpack

+0

@rogerdpack:根据* [此链接](http://scicomp.stackexchange.com/a/1870/1262)*,我其实不这么认为。也许这有点意思,但如果某件事情需要足够的时间值得修复,你会在10个样本中看到它。其他990个样本不会再告诉你。他们实际上并没有告诉你,因为他们总结了所有能够告诉你发生了什么的洞察力。 –

+0

好吧,我看到你的链接:http://stackoverflow.com/questions/375913/what-c​​an-i-use-to-profile-c-code-in-linux,它列出了其他可能有用的工具,如lsstack,oprofile等。谢谢!请参阅我自己的答案,其中列出了我可以找到的取样分析器的内容:http://stackoverflow.com/a/11143125/32453 – rogerdpack

2

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,但只表示“相当完整”,无论如何。

+0

idk如果valgrind是选项,因为我没有编写代码和IDK,如果它取决于有些超时...如果x在请求x的200毫秒内没有发生,则取消。 :) – NoSenseEtAl

+0

它在x86_64上运行速度较慢,但​​速度仍然相当可观。我不能代表ARM。放弃一下,不需要太多的努力。 – ams

+0

等待,isnt valgrind减速10 + x?我不能试试它,因为目标HW没有valgrind或互联网连接。甚至没有GCC。只是可爱的GDB。:) – NoSenseEtAl