为什么DTrace没有流程控制语句?

在2008年的DTrace讨论邮件里,我找到了这个话题:“can i use if/else/for/while in dtrace script?”?而针对这一问题,Chip Bennett给出了如下的解释:
(1)没有循环语句的原因是:clause作为kernel线程运行时是关中断的,所以一旦循环运行很长时间甚至出现死循环状况,就会给系统带来很大影响;
(2)没有if/else语句(同样也是没有循环语句的另一个原因)是因为:每个clause必须产生固定长度的trace记录,即如果一个clause第一次产生了300byte的trace记录,那么接下来每次都会产生300byte。流程控制语句可以包含trace或printf函数,而这些函数可以重复很多次并且破坏上面提到的规则。

最后,Chip Bennett给出了他所知道的“模拟”流程控制的方法:
(1)用不同的predicate把一个probe clause拆成多个;
(2)在DTrace命令行中使用“-C”调用C预处理,并且在DTrace脚本中使用cpp条件语句;
(3)使用条件运算符:(条件?真:假);
(4)在Shell脚本中调用DTrace脚本,或者DTrace脚本中使用Shell变量。

如果你对DTrace感兴趣,欢迎关注DTrace公众号(微信号:chinadtrace,博客地址:http://blog.segmentfault.com/chinadtrace),介绍关于DTrace的使用技巧,经验分享,话题讨论等等。也非常欢迎你转发给其它对DTrace感兴趣的朋友。

你可能感兴趣的:(dtrace)