建立自己的探查器:如何捕获事件?

时间:2011-07-25 14:17:54

标签: c profiling

我无法真正得到this question的答案,所以我会尝试编写一个自定义的,虽然简单的剖析器。刚开始:假设我需要在没有重新编译的情况下找出运行我的代码的核心(和哪个)。假设我还想捕获执行给定函数的时间。最后,关于处理线程的任何想法?关于如何开始的任何其他提示? C是我选择的语言,我正在运行Linux。感谢。

编辑:Oprofile,CallGrind,Helgrind,gprof,papi,tau以及我分析过的其他人似乎都不符合我的需求。

2 个答案:

答案 0 :(得分:2)

我以前确定you've seen this

我发现区分两个不同的目标很有帮助:

  • 衡量各种事物需要多长时间,因此您可以进行演示。作为此演示文稿的一部分,您可能会说“看起来像 frob 例程占用太多时间,或者被调用太多次,建议我们试图加快起来或者少打电话。“

  • 精确定位精确的代码行或指令行,1)不必要,2)值得修复,因为它们可以节省很多执行时间。

我怀疑总体目标是后者。 但要做到这一点,测量是一种非常间接的方法。 相反,你可以利用这样一个事实:如果某些东西浪费了足够的时间值得一看,你可以通过拍摄程序状态的快照来捕获它

所以你没有测量,以便找到花时间。 它需要时间的事实是明确地暴露它,没有暗示参与其中。

以这种方式工作的

Zoom is a profilerLTProf也是如此。 我建立了一次,但坦率地说,我认为手动方法虽然更多,但is more effective,因为它让我更加难以理解为什么程序正在做它正在做的事情。

答案 1 :(得分:1)

你应该尝试linux的perf https://perf.wiki.kernel.org/index.php/Tutorial 该工具直接支持内核,了解页面错误,CPU迁移,上下文切换(例如查看perf stat输出)。此统计信息可以按进程或每个CPU进行聚合。 perf record可以像oprofile一样使用。

要添加简单的分析,您可以使用setitimer(采样信号是整个过程)或timer_create(可以为线程安装定时器信号)。您不能直接获取有关线程使用的物理cpu编号的信息,但是在每个样本中,您可以使用getrusageRUSAGE_THREAD每线程运行一次。