filtrar certos processos e/ou pids no ftrace?

filtrar certos processos e/ou pids no ftrace?

Não tenho certeza se estou pensando sobre isso da maneira certa (e corrija-me se estiver errado), mas o seguinte é meu entendimento do ftrace.

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

set_ftrace_filter

que rastreará apenas as funções listadas dentro,

set_ftrace_notrace

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

set_ftrace_pid

que apenas rastreará os processos com o pid dentro.

Minha pergunta é:existe uma maneira de configurá-lo para que o ftrace rastreie apenas processos que NÃO possuem um determinado pid (ou nome de processo)?

Analogia:

set_ftrace_filter: set_ftrace_notrace:: set_ftrace_pid:x

Fazxexiste e, em caso afirmativo, como posso usá-lo?

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

Tenho lido a documentação e pesquisado na web, mas não consigo encontrar uma maneira de conseguir 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 quero gravar o pid do programa (e os pids de seus filhos, se necessário posteriormente) em um filtro para que eles não sejam incluídos nos dados de rastreamento. Ao ler o rastreamento, eu poderia verificar o pid ao ler cada registro de rastreamento e decidir 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.

Obrigado pelo seu tempo!

Responder1

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

O diretório ftrace é:

/sys/kernel/debug/tracing/

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

Dentro deraw_syscalls," os dois subdiretórios sãosys_enteresaída_sys.

Dentro de sys_enter (e sys_exit, nesse caso), existem os seguintes arquivos:

habilitar

filtro

formatar

eu ia

acionar

"filtro"é aquele com o qual mais nos importamos agora, masformatarpossui informações úteis sobre os campos de uma entrada produzida pelo ftrace quando 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;

Aqui nos preocupamoscommon_pid.

Se você deseja que seu rastreamento omita registros de um processo com PIDn, você editaria

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

Ler:

common_pid != n

Se o programa que você está tentando ignorar durante o rastreamento tiver vários threads ou processos, basta usar o operador &&. Digamos que você queira omitir processos com PIDsn,ó, ep, você editaria o arquivo para que ele leia:

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

Para limpar um filtro, basta escrever "0" para o arquivo:

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

... daria conta do recado.

habilitartem que conter "1"para o evento que você está rastreando, bem comorastreamento_onno diretório ftrace. Escrevendo em0transforma o rastreamento desse evento (ou todo o rastreamento no caso derastreamento_on) desligado.

Escrever nesses arquivos requer permissões de root.

Isso é tudo que consigo pensar. Obrigado a todos que leram/votaram nisso 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, fique à vontade para me denunciar.

dr:para filtrar os 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 isto:

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

Substitua "events/raw_syscalls/sys_enter" pelo evento desejado e substitua meus números pelos PIDs que você deseja ignorar.

informação relacionada