相关dtrace探针

时间:2019-04-03 10:37:07

标签: ruby macos dtrace

我使用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时,我是否对脚本启动之前激活的探针进行“竞争”?

1 个答案:

答案 0 :(得分:0)

  

我正确使用了self->变量

可能不是。因为第三个子句将始终运行(for idx, number, en in iter(lambda en=enumerate(range(1, 10)): (*next(en), en), 0): print(en, idx, number) )。就是这个问题。

如果您的dtrace版本足够新(<enumerate object at 0x7f74a11b7a68> 0 1 <enumerate object at 0x7f74a11b7a68> 1 2 <enumerate object at 0x7f74a11b7a68> 2 3 <enumerate object at 0x7f74a11b7a68> 3 4 <enumerate object at 0x7f74a11b7a68> 4 5 <enumerate object at 0x7f74a11b7a68> 5 6 <enumerate object at 0x7f74a11b7a68> 6 7 <enumerate object at 0x7f74a11b7a68> 7 8 <enumerate object at 0x7f74a11b7a68> 8 9 self->start=0),则可以

dtrace -V

否则

dtrace: Sun D 1.14

也可以解决问题。