我尝试使用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。)
答案 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