【发布时间】:2019-08-24 20:41:34
【问题描述】:
我使用 dtrace 看到了意想不到的结果,因为我的 -entry 和 -return 结果似乎并不总是相关的,我似乎看到太多或太少,并简化了我的脚本来探索什么出错了。
我正在尝试使用以下 D 脚本在我的 Ruby 代码中分析 require "./foo"s 中花费的时间:
ruby*:::require-entry
{
self->start = timestamp;
@counts["require-entry"] = count();
}
ruby*:::require-return
/self->start/
{
@counts["correlated require returns"] = count();
self->start = 0;
}
ruby*:::require-return
/!self->start/
{
/* @reqTimes[copyinstr(arg0)] = quantize(self->start - timestamp); */
@counts["uncorrelated require returns"] = count();
}
运行此打印:
$ time sudo dtrace -q -s script.d -c './script.rb'
correlated require returns 5691
uncorrelated require returns 7872
require-entry 7877
sudo dtrace -q -s script.d -c './script.rb' 0.22s user 0.22s system 3% cpu 13.488 total
- 我是否正确使用了
self->变量(与this->或类似变量相比?) - 我的谓词正确吗?
- 以这种方式运行 dtrace 时,我是否会与在脚本启动之前激活的探针“竞争”?
【问题讨论】:
-
Ruby 严重滥用
setjmp()/longjmp()- 见stackoverflow.com/questions/28569337/…。 Ruby 是否有可能跳入/跳出您尝试跟踪的调用?