我正在自动执行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