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