отфильтровать определенные процессы и/или pid в ftrace?

отфильтровать определенные процессы и/или pid в ftrace?

Я не уверен, что правильно рассуждаю об этом (и, пожалуйста, поправьте меня, если я ошибаюсь), но вот мое понимание 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, которые вы хотите игнорировать.

Связанный контент