在ftrace raw_syscall事件中由arg过滤的语法是什么?

时间:2019-10-25 15:50:21

标签: linux-kernel ftrace

我正在自动执行c ++可执行文件中的ftrace动作,并且几乎可以肯定我过去曾做过这项工作,但现在却不断遇到问题(可能是由于不同内核上的行为不同)版本),并且在分散的在线文档中找不到任何答案。 编辑: 我只是记得我以前做过的事情是在rootkit样式的内核模块中手动分配了kprobe中的变量并匹配kretprobe中的变量, syscall表-一种针对我现在正在执行的过大,不合适,过于危险的解决方案。我想知道通过匹配arg过滤 raw_syscall 时我做错了什么对一个整数。出于可读性考虑,我仅显示shellscript oneliner等效项,因为它们的功能与我的代码相同。理想情况下,我也希望它也可以在较旧的linux内核上运行(如果可能,甚至可以在早期v3上运行),顺便说一句,这就是我过滤raw_syscalls而不是syscall包装函数的原因之一。

我目前正在测试的系统提供的格式如下所示(请注意args数组):

% cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format
name: sys_enter
ID: 17
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;        size:1; signed:0;
        field:int common_pid;                     offset:4;        size:4; signed:1;

        field:long id;                            offset:8;        size:8; signed:1;
        field:unsigned long args[6];              offset:16;      size:48; signed:0;

print fmt: "NR %ld (%lx, %lx, %lx, %lx, %lx, %lx)", REC->id, REC->args[0], REC->args[1], REC->args[2], REC->args[3], REC->args[4], REC->args[5]

,不带args字段的语法有效:

% echo 'id == 44 && common_pid == 2000' \
   > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
% echo $?
0

但是,当我尝试以下操作(以及args语法的许多变体)时,它总是会引发语法错误:

% echo 'id == 44 && common_pid == 2000 && args[5] == 0' \
   > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
-bash: echo: write error: Invalid argument
% cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
id == 44 && common_pid == 2000 && args[5] == 0
^
parse_error: Field not found

0 个答案:

没有答案