filtra certos processos e / ou pids no ftrace?

6

Não tenho certeza se estou pensando sobre isso da maneira correta (e, por favor, corrija-me se estiver errado), mas o seguinte é o meu entendimento sobre a fuga.

Em / sys / kernel / debug / tracing, existem os seguintes arquivos:

set_ftrace_filter

que rastreará apenas as funções listadas,

set_ftrace_notrace

que rastreará apenas as funções NÃO listadas dentro e

set_ftrace_pid

que rastreará somente os processos com o pid dentro.

A minha pergunta é: existe uma maneira de configurá-lo para que o ftrace rastreie apenas processos que NÃO tenham um certo pid (ou nome do processo)?

Analogia:

set_ftrace_filter: set_ftrace_notrace :: set_ftrace_pid: x

Existe x e, em caso afirmativo, como usá-lo?

Por exemplo, se eu quisesse rastrear todos os processos, exceto aquele com o pid 48, existe alguma maneira de colocar algo que significa não 48 em set_ftrace_pid?

Eu tenho lido a documentação e pesquisando na web, mas não consigo encontrar o caminho para isso ou se isso é possível.

Por que estou fazendo isso: Eu tenho um programa que rastreia chamadas de sistema no nível do kernel, mas eu quero escrever o pid do programa (e os pids de seus filhos, se necessário mais tarde) para um filtro para que eles não sejam incluídos nos dados de rastreamento. Ao ler o rastreio, eu poderia verificar o pid enquanto eu lia cada registro de rastreio e decidia se usaria esse registro ou não, mas preferiria não adicionar essa sobrecarga para cada registro lido se houver uma maneira de evitá-lo. / p>

Obrigado pelo seu tempo!

    
por LeapDayWilliam 17.06.2016 / 20:58

1 resposta

4

Eu descobri como fazer o que eu estava descrevendo, mas foi um pouco contra-intuitivo, então estou postando a resposta aqui para pessoas que podem acertar esta página ao pesquisar ( tl: dr; no fundo). Até onde eu sei, não existe uma maneira geral de filtrar os processos com um determinado PID do ftrace tão facilmente quanto dizer a ele para considerar apenas processos com um determinado PID, mas no meu caso , Eu só me importo com as chamadas brutas do sistema (sys_enter) e descobri como eliminar registros com determinados PIDs de serem incluídos para eles e é assim:

O diretório ftrace é:

/sys/kernel/debug/tracing/

Dentro, há um diretório chamado " events ." A partir daqui, você pode ver todas as coisas que o ftrace pode rastrear, mas, no meu caso, eu entro em " raw_syscalls ".

Dentro de raw_syscalls , "os dois subdiretórios são sys_enter e sys_exit .

Dentro de sys_enter (e sys_exit, para esse assunto), existem os seguintes arquivos:

enable

filter

format

id

trigger

" filtro " é o que mais nos interessa agora, mas o formato tem informações úteis sobre os campos de uma entrada produzidos pelo ftrace quando o sys_enter está ativado:

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;

Aqui, nos preocupamos com common_pid .

Se você quiser que seu rastreio omita registros de um processo com PID n , edite

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

Para ler:

common_pid != n

Se o programa que você está tentando ignorar enquanto rastreia tem vários segmentos ou vários processos, basta usar o & & operador. Digamos que você queira omitir processos com PIDs n , o e p , você editaria o arquivo para que ele leia:

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

Para limpar um filtro, basta escrever " 0 " no arquivo:

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

... faria o truque.

enable deve conter " 1 " para o evento que você está rastreando, bem como tracing_on no diretório ftrace. Escrever em 0 transforma o rastreio desse evento (ou todo o rastreio no caso de tracing_on ) desativado.

Escrever para esses arquivos requer permissões de root.

Isso é tudo o que posso pensar. Obrigado a todos que leram / votaram sobre isso e espero que minha resposta ajude alguém. Se alguém souber de uma maneira que faça o que eu fiz parecer estúpido, sinta-se à vontade para me chamar.

tl; dr: para filtrar registros do processo 48, escreva:

common_pid != 48

... para

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

Filtre vários PIDs (por exemplo, 48, 49, 53, 58) escrevendo:

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

Substitua "events / raw_syscalls / sys_enter" pelo seu evento desejado e substitua meus números por quaisquer PIDs que você queira ignorar.

    
por 27.06.2016 / 00:03