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

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

    One Solution collect form web for “отфильтровать определенные процессы и / или pids в ftrace?”

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

    Interesting Posts

    Я хотел бы запустить несколько команд терминала изнутри vim

    Ошибка «Ошибка: разрешение отказа» от Transfer Client

    Что означает ls -alh?

    rpmbuild: как я могу «потребовать» один пакет * или * другой

    Получение всех файлов содержит значение даты меньше даты ввода

    Возможно ли создать freebsd 10 или 11 тюрьму в freebsd 9?

    Как полностью скрыть вещи от пользователя?

    Базовая ОС Linux с приложениями GNU и TWM

    Выполнение программы, вызванной оболочкой, вызываемой crontab, возвращает код 127

    Эффективное перемещение между различными рабочими пространствами

    Правило Udev для автоматического подключения мультимедийных устройств перестало работать после обновления systemd до версии 239

    Команда grep в curl

    Не удалось загрузить диск под Linux

    Есть текстовый редактор в GNU / Linux, где CTRL ++ для создания шрифта больше работает?

    Разделить физический X-дисплей на два виртуальных дисплея?

    Linux и Unix - лучшая ОС в мире.