Я не уверен, что правильно рассуждаю об этом (и, пожалуйста, поправьте меня, если я ошибаюсь), но вот мое понимание ftrace.
В /sys/kernel/debug/tracing находятся следующие файлы:
set_ftrace_filter
который будет отслеживать только функции, перечисленные внутри,
set_ftrace_notrace
который будет отслеживать только функции, НЕ перечисленные внутри, и
set_ftrace_pid
который будет отслеживать только процессы с pid внутри.
Мой вопрос:есть ли способ настроить ftrace так, чтобы он отслеживал только процессы, у которых НЕТ определенного pid (или имени процесса)?
Аналогия:
set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid :Икс
ДелаетИкссуществует, и если да, то как его использовать?
Например, если я хочу отследить все процессы, кроме процесса с pid 48, есть ли способ указать что-то осмысленное?не 48в set_ftrace_pid?
Я читал документацию и искал в Интернете, но не смог найти ни способа добиться этого, ни возможности этого.
Почему я это делаю:У меня есть программа, которая отслеживает системные вызовы уровня ядра, но я хочу записать pid программы (и pid ее потомков, если это понадобится позже) в фильтр, чтобы они не включались в данные трассировки. При чтении трассировки я мог бы проверять pid по мере чтения каждой записи трассировки и решать, использовать эту запись или нет, но я бы предпочел не добавлять эти накладные расходы для каждой считываемой записи, если есть способ избежать этого.
Спасибо за ваше время!
решение1
Я понял, как сделать то, что описал, но это немного нелогично, поэтому я публикую ответ здесь для тех, кто может попасть на эту страницу при поиске (кратко:на дне). Насколько я знаю,Не существует универсального способа просто отфильтровать процессы с определенным PID из ftrace так же просто, как указать ему рассматривать ТОЛЬКО процессы с определенным PID, но в моем случае меня интересуют только необработанные системные вызовы (sys_enter), и я нашел, как исключить записи с определенными PID из включения в них, и вот как это сделать:
Каталог ftrace:
/sys/kernel/debug/трассировка/
Внутри есть каталог под названием "события"Отсюда вы можете увидеть все, что ftrace может отслеживать, но в моем случае я перехожу в "raw_syscalls."
В пределахraw_syscalls," два подкаталога - этоsys_enterиsys_exit.
Внутри sys_enter (и sys_exit, если на то пошло) находятся следующие файлы:
давать возможность
фильтр
формат
идентификатор
курок
"фильтр"это то, что нас сейчас больше всего волнует, ноформатсодержит полезную информацию о полях записи, созданной ftrace при включенном sys_enter:
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;
Здесь мы заботимся оcommon_pid.
Если вы хотите, чтобы ваша трассировка исключала записи из процесса с PIDн, вы бы отредактировали
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
Читать:
common_pid != n
Если программа, которую вы пытаетесь игнорировать при трассировке, имеет несколько потоков или несколько процессов, вы просто используете оператор &&. Допустим, вы хотите исключить процессы с PIDн,о, ип, вам следует отредактировать файл так, чтобы он выглядел следующим образом:
common_pid != n && common_pid != o && common_pid != p
Чтобы очистить фильтр, просто напишите "0"к файлу:
echo "0" > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
...сделало бы свое дело.
давать возможностьдолжен содержать "1" для отслеживаемого вами события, а такжетрассировка_нав каталоге ftrace. Пишем в0включает трассировку этого события (или всю трассировку в случаетрассировка_на) выключенный.
Для записи в эти файлы требуются права root.
Это все, что я могу придумать. Спасибо всем, кто прочитал/проголосовал за это, и я надеюсь, что мой ответ кому-то поможет. Если кто-то знает способ, который заставляет то, как я это сделал, выглядеть глупо, не стесняйтесь бросить мне вызов.
вкратце:чтобы отфильтровать записи из процесса 48, напишите:
common_pid != 48
...к
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
Отфильтруйте несколько PID (например, 48, 49, 53, 58), написав вместо этого следующее:
common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58
Замените «events/raw_syscalls/sys_enter» на желаемое событие, а мои цифры — на любые PID, которые вы хотите игнорировать.