如何避免"探测开销超过阈值"使用系统点击时出错?

时间:2016-10-31 01:02:12

标签: c linux debugging trace systemtap

我尝试使用stap打印出程序调用的所有函数。我在网上做了一些研究并发现了这个脚本(名为para-callgraph.stp):

#! /usr/bin/env stap

function trace(entry_p, extra) {
  printf("%s%s%s %s\n",
         thread_indent (entry_p),
         (entry_p>0?"->":"<-"),
         ppfunc (),
         extra)
}

probe $1.call   { trace(1, $$parms) }
probe $1.return { trace(-1, $$return) }

这是打算像这样运行:

sudo stap para-callgraph.stp 'process.function("*")' -c `pwd`/my-program

现在当我运行这个时,我遇到了一个问题。一切都很好,但很快systemtap将此打印到stderr,然后退出:

ERROR: probe overhead exceeded threshold
WARNING: Number of errors: 1, skipped probes: 0
WARNING: There were 62469 transport failures.
WARNING: /usr/bin/staprun exited with status: 1
Pass 5: run failed.  [man error::pass5]
Tip: /usr/share/doc/systemtap/README.Debian should help you get started.

进行一些研究online向我透露,正在触发stap启发式关闭并关闭我,并且我可以通过添加两个标记-g和{{1}来关闭它}}。 (这个建议由--suppress-time-limits在我的系统上备份。)但是,该解决方案根本不起作用并且命令:

man stap

打印一条非常相似的错误消息,然后退出:

sudo stap -g --suppress-time-limits para-callgraph.stp 'process.function("*")' -c `pwd`/core-cpu1

为什么这个标志不是我问题的合适解决方案?这个问题可以通过其他方式解决,还是systemtap根本不适合这种用例?

如果重要,我在32位Ubuntu VM上运行它。

N.B。我最感兴趣的是systemtap在这里失败的原因,而不是使用其他软件完成同样事情的其他方法。 (事实上​​,结果是我的用例,上面的代码 滥用了systemtap。)

1 个答案:

答案 0 :(得分:0)

探针和消费者之间的传输缓冲区也是有限的,因此如果您将使用探针进行打印 比消费者更快,您将看到SystemTap中的NN传输失败错误或DTrace上的CPU X错误导致DTrace丢失。

这个问题的答案是 简单:不那么冗长,更频繁地从缓冲区中获取数据(由cleanrate调节 DTrace中的可调参数)或增加缓冲区大小(-b选项和DTrace中的bufsize可调参数) SystemTap中的-s选项。

参考:http://myaut.github.io/dtrace-stap-book/dtrace-stap-book-ns.pdf