отфильтровать определенные процессы и / или pids в 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: x

Существует ли x , и если да, то как его использовать?

Например, если бы я хотел проследить все процессы, кроме одного с pid 48, есть ли способ добавить что-то значение не 48 в set_ftrace_pid?

Я читал документацию и искал в Интернете, но я не могу найти способ достичь этого или это возможно.

Почему я это делаю: у меня есть программа, которая отслеживает системные вызовы на уровне ядра, но я хочу написать pid программы (и ее дочерние элементы, если необходимо позже) в фильтр, чтобы они не были включены с данные трассировки. При чтении трассировки я мог проверять pid, когда я читал каждую запись трассировки и решал, использовать ли эту запись или нет, но я бы предпочел не добавлять эти накладные расходы для каждой прочитанной записи, если есть способ ее избежать.

Спасибо за ваше время!

    Я понял, как делать то, что я описывал, но это было немного противоречиво, поэтому я отправляю ответ здесь для людей, которые могут попасть на эту страницу при поиске ( tl: dr; внизу). Насколько я знаю, нет простого способа просто отфильтровывать процессы с определенным PID из ftrace так же легко, как это сказать, ТОЛЬКО рассматривать процессы с определенным PID, но в моем случае я забочусь только о необработанной системе звонки (sys_enter), и я узнал, как исключить записи с определенными идентификаторами PID для включения в них, и вот как это сделать:

    Каталог ftrace:

    / SYS / ядро ​​/ отладки / трассировки /

    Внутри есть каталог с названием « события ». Отсюда вы можете увидеть все, что может проследить 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 n , вы должны редактировать

    / SYS / ядро ​​/ отладки / трассировки / События / raw_syscalls / sys_enter / фильтр

    Читать:

     common_pid != n 

    Если программа, которую вы пытаетесь игнорировать во время трассировки, имеет несколько потоков или несколько процессов, вы просто используете оператор &&. Предположим, вы хотите опустить процессы с помощью PID n , o и p , вы должны отредактировать файл, чтобы он читал:

     common_pid != n && common_pid != o && common_pid != p 

    Чтобы очистить фильтр, вы просто пишете « 0 » в файл:

    echo "0"> / sys / kernel / debug / tracing / events / raw_syscalls / sys_enter / filter

    … сделал бы трюк.

    enable должен содержать « 1 » для отслеживаемого события, а также tracing_on в каталоге ftrace. Запись в 0 превращает трассировку этого события (или все трассировки в случае tracing_on ).

    Для записи в эти файлы требуются права root.

    Это все, о чем я могу думать. Спасибо всем, кто прочитал / проголосовал за это, и я надеюсь, что мой ответ поможет кому-то. Если кто-то знает способ, который делает так, как я это делал, выглядите глупо, не стесняйтесь вызывать меня.

    tl; dr: чтобы отфильтровать записи из процесса 48, напишите:

     common_pid != 48 

    … в

    / SYS / ядро ​​/ отладки / трассировки / События / raw_syscalls / sys_enter / фильтр

    Отфильтруйте несколько PID (например, 48, 49, 53, 58), написав вместо этого:

     common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58 

    Замените «events / raw_syscalls / sys_enter» на ваше желаемое событие и замените мои номера на любые PID, которые вы хотите игнорировать.