GDB是否支持;“运行时采样”;还是有一个用户;“扩展”;就这样

GDB是否支持;“运行时采样”;还是有一个用户;“扩展”;就这样,gdb,profiling,Gdb,Profiling,动机:我无法让google cpu profiler在代码运行的机器上工作(我最后一口气诅咒libunwind:),所以我想知道gdb是否支持程序执行的高频随机暂停,存储中断发生的函数名,并计算它在函数x中暂停的次数。 这就是我所说的“运行时采样”,可能还有更精确/更智能的名称。 我看了oprofile,但要想弄清楚它是否能做到这一点是很复杂的 编辑:显然正确的名称是: “统计抽样方法” 编辑2:我之所以悬赏,是因为我看到一些ppl建议用bt进行手动中断10-20x和检查堆栈。。。 说到时间,似

动机:我无法让google cpu profiler在代码运行的机器上工作(我最后一口气诅咒libunwind:),所以我想知道gdb是否支持程序执行的高频随机暂停,存储中断发生的函数名,并计算它在函数x中暂停的次数。 这就是我所说的“运行时采样”,可能还有更精确/更智能的名称。 我看了oprofile,但要想弄清楚它是否能做到这一点是很复杂的 编辑:显然正确的名称是: “统计抽样方法”

编辑2:我之所以悬赏,是因为我看到一些ppl建议用bt进行手动中断10-20x和检查堆栈。。。 说到时间,似乎非常浪费,所以我对一些智能ppl进行了估算

编辑3:gprof不会把它剪掉。。。我最近试着在ARM系统上运行它,结果是垃圾…:(我想它的多线程问题就是原因…

您可以通过在运行时暂停GDB来手动在GDB中采样

你似乎认为你想要的是,但是 如果你的目标是尽快完成这个项目,那么我建议你

  • 高频率的采样是没有帮助的

  • 计算程序计数器位于函数X中的样本数没有帮助,除非是在人为的小程序中


如果您遵循该链接,您将看到成功的原因和方向。

GDB不会很好地做到这一点,尽管您肯定可以修改一些导致非常不准确结果的内容

我建议使用Valgrind的“Callgrind”插件。作为奖励,它绝对不需要重新编译或其他特殊设置。您所需要的只是在系统中安装Valgrind,并在程序中提供调试信息(或者,至少是完整的符号信息;我不确定)

然后按如下方式调用程序:

valgrind --tool=callgrind <your program command line>
valgrind--tool=callgrind
完成后,当前目录中将有一个文件名
callgrind.out.
。您可以使用名为
kcachegrind
的非常好的GUI工具读取和可视化此文件(通常您必须单独安装)

唯一的问题是,因为callgrind稍微减慢了程序的执行速度,所以花费在系统调用上的时间可能会减少(以百分比表示)默认情况下,callgrind在其计数器中不包含系统时间,因此它给您的值是程序中代码的真实比较,如果不是该函数下的实际时间的话。这可能会让人困惑,因此如果发生这种情况,请尝试添加
--collect systime=yes


我不确定ARM上callgrind的状态可能是什么。ARMv7是,但只说“相当完整”,不管这意味着什么。

不必使用gprof标志编译的高频率采样将很有帮助。@rogerdpack:我不这么认为,根据。也许这有点牵强,但如果某件事情需要足够的时间来修复,您将在10个示例中看到它。其他990个示例不会告诉您更多信息。它们实际上告诉了您你应该少一点,因为他们总结了所有告诉你发生了什么的洞见。好吧,我在你的链接中看到:它列出了其他可能有用的工具,如lsstack、oprofile等。谢谢!也可以在这里看到我自己的答案,其中列出了我可以找到的采样分析器:如果你没有尝试过,手动采样似乎是浪费。参见第1 c节Omnent.The.codelidoo注释的最后一段。尝试一下,如果valgrind是一个选项,那么就弃用它。idk,因为我没有编写代码,如果它取决于一些超时,那么就使用idk…如果x在请求x的200毫秒内没有发生,也就是取消:)它在x86_64上运行得比较慢,但速度仍然相当可观。我不能用手臂说话。试一试,不费吹灰之力。等等,valgrind 10+x不是吗?我不能只是尝试,因为目标硬件没有valgrind或互联网连接。甚至连GCC都没有。只是可爱的GDB.:)我认为callgrind比memcheck好一点,但我不确定。互联网确实不是一个棘手的问题顺便说一句,I/O事件的200毫秒超时仍然可以正常工作,因为这都是在内核中运行的,在valgrind之外。如果您有多个线程,那么这就不同了,而且无论如何都很难分析。