Я автоматизирую действия 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