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

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

제가 이것을 올바른 방향으로 생각하고 있는지 확신할 수 없지만(제가 틀렸다면 정정해 주십시오) 다음은 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 :엑스

하다엑스존재한다면 어떻게 사용하나요?

예를 들어, PID가 48인 프로세스를 제외한 모든 프로세스를 추적하고 싶다면 뭔가 의미를 부여할 수 있는 방법이 있을까요?48이 아니다set_ftrace_pid에?

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

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

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

답변1

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

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

/sys/kernel/디버그/추적/

그 안에는 "이벤트." 여기에서 ftrace가 추적할 수 있는 모든 항목을 볼 수 있지만 제 경우에는 "raw_syscalls."

이내에raw_syscalls," 두 개의 하위 디렉터리는 다음과 같습니다.sys_enter그리고sys_exit.

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;

여기서 우리는 관심을 갖고 있습니다.common_pid.

추적에서 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해당 이벤트에 대한 추적(또는 다음과 같은 경우 모든 추적)이 수행됩니다.추적 중) 끄다.

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

그게 제가 생각할 수 있는 전부입니다. 이것을 읽고 투표해주신 모든 분들께 감사드리며 제 답변이 누군가에게 도움이 되기를 바랍니다. 내가 한 방식을 어리석게 보이게 만드는 방법을 아는 사람이 있으면 언제든지 저에게 전화해 주세요.

tl;dr:프로세스 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로 바꾸세요.

관련 정보