控制事件
事件可以分别设置为启用(记录)、禁用(不记录),或者设置过滤。另外,也可以以事件组为单位进行统一控制。
记录/不记录的控制可以通过操作set_events或各事件、各组的enable特殊文件来进行。以与available_events相同的“组名:事件名”的格式向set_events写入想要开始记录的事件列表。
[tracing]#cat>set_events
irq:irq_handler_entry
irq:irq_handler_exit
^D
使用events目录下的enable特殊文件的方法是向各事件或各组写入启用或禁用选项。
[tracing]#echo 1>events/irq/irq_handler_entry/enable
[tracing]#echo 1>events/irq/irq_handler_exit/enable
不管使用的是哪个方法,在其中一个接口上设置的状态都会自动反映到另一个接口上,因此一般来说可以这样使用。
·想要从命令行添加事件时,使用events目录。
·想要保存已添加事件的设置时,或想要将已保存的设置恢复时,使用set_events。例如,还可以暂时保存事件,并发送到想要获取同一事件的其他机器后再写入。
手头的机器
[tracing]#cat set_events>/tmp/event_set1
[tracing]#scp/tmp/event_set1 remote:~/
远程机器
[tracing]#cat~/event_set1>set_events
而事件过滤器是使用events目录下的filter特殊文件进行设置的。事件过滤器是通过事件发生时的参数值来设置是否记录的功能。参数大致可以分为数值参数和字符串参数,各自可使用的比较运算符有所不同(见表8-12)。过滤器的比较表达式必须是左边为参数名,右边为值。也就是说,可以指定irq<=10,但不能指定10>=irq。
另外,也可以使用逻辑运算符和小括号组合多个过滤器。例如,在参数irq的值介于10~20或name以ata开头的情况下,想要记录事件时的过滤器如下所示。
(irq>=10&&irq<20)||name~ata*
另外,ftrace有一个特点,就是文本输出的追踪结果即使看起来像字符串,有些参数也只是在输出文本时在内部进行了转换,它们实际还是数值。对于这样的参数不能使用用于字符串参数的比较运算符。
[tracing]#echo"ret==unhandled">events/irq/irq_handler_exit/flter#这个出错
bash:echo:write error:Invalid argument
[tracing]#echo"ret==0">events/irq/irq_handler_exit/flter#这个没问题
要找出这样的疑似字符串参数,就需要阅读format特殊文件。
[tracing]#cat events/irq/irq_handler_exit/format
name:irq_handler_exit
ID:97
format:
field:unsigned short common_type;offset:0;size:2;signed:0;
field:unsigned char common_flags;offset:2;size:1;signed:0;
field:unsigned char common_preempt_count;offset:3;s i z e:1;
signed:0;
field:int common_pid;offset:4;size:4;signed:1;
field:int common_lock_depth;offset:8;size:4;signed:1;
field:int irq;offset:12;size:4;signed:1;
field:int ret;offset:16;size:4;signed:1;
print fmt:"irq=%d ret=%s",REC->irq, REC->ret?"handled":"unhandled"
根据format可以看出,参数ret记录为int类型,在print fmt中,如果ret!=0则显示为handled,如果ret==0则显示为unhandled。过滤器可以适用于format部分所示格式的数据,因此ret必须作为数值参数。