Каков синтаксис для фильтрации по аргументу в событиях ftrace raw_syscall? - PullRequest
0 голосов
/ 25 октября 2019

Я автоматизирую действия ftrace в исполняемом файле c ++ и почти уверен, что у меня это работало в прошлом, но сейчас у меня постоянно возникают проблемы (возможно, из-за разного поведения в разных версиях ядра)) и не может найти ответ в разбросанной документации онлайн. РЕДАКТИРОВАТЬ: Я только что вспомнил, что ранее я назначил переменную в kprobe и сопоставил переменную в kretprobe из модуля ядра в стиле руткита, который вручную исправил системный вызовтаблица - решение, которое является излишним, неуместным и слишком опасным для того, что я делаю сейчас. Я хочу знать, что я делаю неправильно, фильтруя raw_syscall путем сопоставления аргумента с целым числом,Для удобства чтения я просто показываю эквиваленты оболочки в виде шеллскрипта, потому что они выполняют те же функции, что и мой код. В идеале мне бы хотелось, чтобы это работало и на старых ядрах Linux (даже на ранней версии v3, если это возможно), и, кстати, это одна из причин, по которой я фильтрую неочищенные функции-сырцы вместо raw-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
...