No estoy seguro de si estoy pensando en esto de la manera correcta (y corríjame si me equivoco), pero lo siguiente es mi comprensión de ftrace.
En /sys/kernel/debug/tracing, se encuentran los siguientes archivos:
set_ftrace_filter
que solo rastreará las funciones enumeradas en el interior,
set_ftrace_notrace
que solo rastreará las funciones que NO figuran en el interior, y
set_ftrace_pid
que solo rastreará los procesos con el pid dentro.
Mi pregunta es:¿Hay alguna manera de configurarlo para que ftrace solo rastree procesos que NO tengan un determinado pid (o nombre de proceso)?
Analogía:
set_ftrace_filter: set_ftrace_notrace :: set_ftrace_pid:X
HaceXexiste y, de ser así, ¿cómo lo uso?
Por ejemplo, si quisiera rastrear todos los procesos excepto el que tiene el pid 48, ¿hay alguna manera de darle algún significado?no 48en set_ftrace_pid?
He estado leyendo la documentación y buscando en la web, pero no encuentro la manera de lograrlo ni si es posible.
Por qué estoy haciendo esto:Tengo un programa que rastrea llamadas al sistema a nivel de kernel, pero quiero escribir el pid del programa (y los pids de sus hijos, si es necesario más adelante) en un filtro para que no se incluyan en los datos de seguimiento. Al leer el seguimiento, podría verificar el pid a medida que leo cada registro de seguimiento y decidir si usar ese registro o no, pero preferiría no agregar esta sobrecarga para cada registro que se lee si hay una manera de evitarlo.
¡Gracias por tu tiempo!
Respuesta1
Descubrí cómo hacer lo que estaba describiendo, pero era un poco contrario a la intuición, así que publico la respuesta aquí para las personas que puedan acceder a esta página cuando realicen una búsqueda (tl: dr;en el fondo). Por lo que yo sé,No existe una forma general de filtrar procesos con un determinado PID de ftrace tan fácilmente como decirle que SOLO considere procesos con un determinado PID, pero en mi caso, solo me importan las llamadas al sistema sin procesar (sys_enter) y Descubrí cómo eliminar registros con ciertos PID para que no se incluyan en ellos y así es como:
El directorio ftrace es:
/sys/kernel/debug/tracing/
Dentro hay un directorio llamado "eventos." Desde aquí, puedes ver todas las cosas que ftrace puede rastrear, pero para mi caso, entro en "llamadas_sys_raw".
Dentrollamadas_sys_raw," los dos subdirectorios sonsistema_enterysalida_sys.
Dentro de sys_enter (y sys_exit, de hecho), se encuentran los siguientes archivos:
permitir
filtrar
formato
identificación
desencadenar
"filtrar" es el que más nos importa en este momento, peroformatotiene información útil sobre los campos de una entrada producida por ftrace cuando sys_enter está habilitado:
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;
Aquí nos preocupamospid_común.
Si desea que su rastreo omita registros de un proceso con PIDnorte, editarías
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
Leer:
common_pid != n
Si el programa que intenta ignorar durante el seguimiento tiene múltiples subprocesos o múltiples procesos, simplemente use el operador &&. Digamos que desea omitir procesos con PIDnorte,oh, ypag, editarías el archivo para que diga:
common_pid != n && common_pid != o && common_pid != p
Para borrar un filtro, simplemente escribe "0" al archivo:
echo "0" > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
...sería suficiente.
permitirtiene que contener "1"para el evento que estás rastreando así comorastreo_enen el directorio ftrace. Escribiendo en0convierte el rastreo de ese evento (o todo el rastreo en el caso derastreo_en) apagado.
Escribir en estos archivos requiere permisos de root.
Eso es todo lo que puedo pensar. Gracias a cualquiera que haya leído/votado esto y espero que mi respuesta ayude a alguien. Si alguien conoce una manera que hace que la forma en que lo hice parezca estúpida, no dude en llamarme.
tl;dr:para filtrar registros del proceso 48, escriba:
common_pid != 48
...a
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
Filtre varios PID (por ejemplo, 48, 49, 53, 58) escribiendo esto en su lugar:
common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58
Reemplace "events/raw_syscalls/sys_enter" con el evento que desee y reemplace mis números con los PID que desee ignorar.