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