1

我试图用来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.

在网上做一些研究告诉我,一个stap启发式方法被触发并关闭了我,我可以通过添加两个标志-g--suppress-time-limits. (这个建议在我的系统上得到了支持man stap。)但是,该解决方案根本不起作用,命令:

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

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

ERROR: probe overhead exceeded threshold
WARNING: Number of errors: 1, skipped probes: 0
WARNING: There were 67287 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.

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

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

注意我最感兴趣的是为什么 systemtap 在这里失败,而不是使用其他软件完成相同事情的其他方法。(事实上​​,对于我的用例,上面的代码对 systemtap 的滥用。)

4

1 回答 1

0

探针和消费者之间的传输缓冲区也受到限制,因此如果您在探针中打印的速度比消费者可以接受的速度快,您将看到 SystemTap 中出现 NN 传输失败错误或 DTrace 在 DTrace 上出现 CPU X 上的 DTrace 下降错误。

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

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

于 2017-10-22T01:13:42.283 回答