我试图用来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 的滥用。)