ftrace에서 특정 프로세스 및/또는 PID를 필터링하시겠습니까?

ftrace에서 특정 프로세스 및/또는 PID를 필터링하시겠습니까?

제가 이것을 올바른 방향으로 생각하고 있는지 확신할 수 없지만(틀렸다면 정정해 주십시오), 아래는 ftrace에 대한 제가 이해한 것입니다.

/sys/kernel/debug/tracing에는 다음 파일이 있습니다:

ftrace_filter 설정

내부에 나열된 기능만 추적합니다.

set_ftrace_notrace

여기에 나열되지 않은 기능만 추적합니다.

set_ftrace_pid

pid가 있는 프로세스만 추적합니다.

내 질문은 다음과 같습니다ftrace가 특정 pid(또는 프로세스 이름) 없이 프로세스만 추적하도록 구성하는 방법이 있습니까?

직유:

set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid :엑스

하다엑스존재합니까? 존재한다면 어떻게 사용합니까?

예를 들어, pid 48을 제외한 모든 프로세스를 추적하려는 경우 뭔가 의미가 있는 방법이 있습니까?48이 아님set_ftrace_pid를 입력하시겠습니까?

문서를 읽고 웹을 검색했지만 이를 달성할 수 있는 방법이나 이것이 가능한지 찾을 수 없습니다.

내가 이 일을 하는 이유는 다음과 같습니다.커널 수준 시스템 호출을 추적하는 프로그램이 있지만 추적 데이터에 포함되지 않도록 프로그램의 pid(나중에 필요한 경우 하위 프로세스의 pid)를 필터에 기록하고 싶습니다. 추적을 읽을 때 각 추적 레코드를 읽을 때 pid를 확인하고 해당 레코드를 사용할지 여부를 결정할 수 있지만 이를 방지할 수 있는 방법이 있다면 읽은 모든 레코드에 대해 이 오버헤드를 추가하고 싶지 않습니다.

시간 내 주셔서 감사합니다!

답변1

제가 설명한 내용을 수행하는 방법을 알아냈지만 다소 직관에 어긋나기 때문에 검색할 때 이 페이지를 방문할 수도 있는 분들을 위해 여기에 답변을 게시합니다(TL: 박사;하단). 내가 아는 한,특정 PID가 있는 프로세스만 고려하도록 지시하는 것처럼 ftrace에서 특정 PID가 있는 프로세스를 필터링하는 포괄적인 방법은 없지만 제 경우에는 원시 시스템 호출(sys_enter)에만 관심이 있고 방법을 찾았습니다. 다음과 같이 특정 PID가 포함된 레코드가 포함되지 않도록 제거합니다.

ftrace 디렉터리는 다음과 같습니다.

/sys/커널/디버그/추적/

"라는 파일이 있습니다.이벤트" 여기에서 ftrace가 추적할 수 있는 모든 것을 볼 수 있지만 제 경우에는 "원시 시스템 호출".

이내에원시 시스템 호출," 이 두 하위 디렉터리는시스템 입력그리고시스템 종료.

sys_enter(및 sys_exit) 내부에는 다음 파일이 있습니다:

~할 수 있게 하다

필터

체재

ID

방아쇠

"필터"그게 지금 가장 걱정되는 부분이지만,체재sys_enter가 활성화된 경우 ftrace가 생성한 입력 필드에 대한 유용한 정보가 있습니다.

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;

여기서 우리는 다음과 같은 사항에 관심을 두고 있습니다.공개 프로세스 번호.

PID가 있는 프로세스의 레코드를 무시하도록 추적하려는 경우N, 편집하겠습니다

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

읽다:

common_pid != n

추적하는 동안 무시하려는 프로그램에 여러 스레드나 프로세스가 있는 경우 && 연산자를 사용하면 됩니다. PID가 있는 프로세스를 생략하고 싶다고 가정해 보겠습니다.N,, 그리고, 다음과 같이 파일을 편집할 수 있습니다.

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

필터를 지우려면 "0" 파일로:

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

...그리고 그게 다야.

~할 수 있게 하다"를 포함해야 합니다.1"귀하가 추적하고 있는 이벤트에 대해추적이 켜져 있습니다.ftrace 디렉토리에 있습니다. 에 쓰다0이 이벤트에 대한 추적(또는 다음 경우에는 모든 추적)추적이 켜져 있습니다.) 떠나다.

이러한 파일에 쓰려면 루트 권한이 필요합니다.

그게 내가 생각할 수 있는 전부입니다. 읽고/투표해주신 분들께 감사드립니다. 제 답변이 누군가에게 도움이 되기를 바랍니다. 내가 하고 있는 일을 바보처럼 보이게 만드는 방법을 아는 사람이 있으면 언제든지 전화해 주세요.

간단히 말해서:프로세스 48의 레코드를 필터링하려면 다음을 작성하십시오.

common_pid != 48

...도착하다

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

다음을 작성하여 여러 PID(예: 48, 49, 53, 58)를 필터링합니다.

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

"events/raw_syscalls/sys_enter"를 원하는 이벤트로 바꾸고 내 번호를 무시하려는 PID로 바꾸세요.

관련 정보