strace -e trace= — 시스템콜만 골라 보려면?

strace e trace 필터는 “전부 찍기” 대신 관심 시스템콜만 남기는 옵션입니다. strace(1)의 -e trace= / --trace=로 호출 이름·정규식·% 분류를 고르면 로그가 짧아지고 해석이 빨라집니다. 이 글은 필터 문법 · 네트워크/파일만 · 성능 영향만 다룹니다. 설치·-p 붙이기·기본 출력 읽기 같은 전체 strace 입문과는 각도를 분리했습니다. 요금·제휴·창작 벤치 숫자는 없습니다.

근거는 strace(1) man page의 -e expr / -e trace= 절입니다.

필터 문법은?

한 줄 답: -e expr의 형식은 [qualifier=][!]value[,value]...이고, **qualifier를 생략하면 기본이 trace**입니다. 따라서 -e open은 -e trace=open과 같고, --trace=도 동일합니다.

실무에서 자주 쓰는 형태:

형태의미
-e trace=openopen만
-e trace=open,close,read,write나열한 호출만
-e trace=!openopen을 제외한 나머지
-e trace=all / none전부 / 없음(기본은 all)
-e trace=/^open/POSIX ERE에 맞는 이름만
# 기본 qualifier=trace
strace -e open cat /dev/null
strace -e trace=open,close cat /dev/null
strace --trace=open,close cat /dev/null

# 부정: 셸 history 확장에 !가 걸릴 수 있어 이스케이프
strace -e 'trace=!open' cat /dev/null
strace -e trace=\!open cat /dev/null

부가 문법(man):

  • ?value: 매칭되는 호출이 없어도 오류를 숨깁니다.
  • value@64 / @32 / @x32: 해당 personality로 한정합니다.
  • 일부만 보면 기록되지 않은 호출까지 포함한 전체 동작을 단정하기 어렵습니다. man도 이 점을 경고합니다.

어떤 호출이 많은지 먼저 보려면 -c/--summary-only로 요약만 낸 뒤, 그 목록으로 trace=를 좁히는 순서가 안전합니다.

네트워크/파일만 보려면?

한 줄 답: 파일 이름 인수 계열은 %file, 네트워크는 %net(또는 %network)입니다. % 없는 file/network 표기는 man에서 deprecated이므로 % 형식을 씁니다.

# 파일이 어디로 열리는지 / 어떤 경로를 만지는지
strace -e trace=%file ls /tmp

# 소켓·연결 등 네트워크 관련만
strace -e trace=%net curl -sI https://example.com

# 둘 다 (쉼표로 합침)
strace -e trace=%file,%net your-app

자주 쓰는 % 분류(발췌):

분류용도
%file파일 이름을 인수로 받는 호출 묶음(open/stat/unlink 계열 등)
%net / %network네트워크 관련 호출
%process생성·exec·종료
%desc파일 디스크립터 관련
%signal시그널 관련
%memory메모리 맵 관련

%file을 쓰는 이유는 수동으로 open,stat,...을 나열하다 newfstatat 같은 변종을 빠뜨리기 쉽기 때문입니다. man이 그 점을 명시합니다.

경로 하나로 더 좁히려면 -P path / --trace-path=path를 여러 번 쓸 수 있습니다. FD 번호로 한정할 때는 -e trace-fds=가 있습니다(FD를 쓰지 않는 호출은 함께 걸러집니다).

# 특정 경로에 닿는 호출만 (복수 -P 가능)
strace -P /etc/passwd -e trace=%file cat /etc/passwd

성능 영향은?

한 줄 답: 추적 중인 프로세스는 추적하지 않을 때보다 느려집니다. 출력만 줄이는 trace=와, 멈출 호출 자체를 줄이는 --seccomp-bpf는 다른 축입니다.

man BUGS:

  • 추적 대상은 비추적보다 느립니다.
  • 영향은 --seccomp-bpf로 완화할 수 있습니다.
  • --seccomp-bpf는 -f/--follow-forks와 함께 쓸 때 의미가 있고, -p attach·일부 옵션과는 호환되지 않습니다.
  • 필터 설정에 실패하면 strace는 매 시스템콜마다 멈추는 기존 방식으로 진행합니다.

실무 해석:

  1. trace=%file만 — 로그 I/O·가독성은 좋아집니다. 다만 seccomp-bpf가 없으면 커널/트레이서가 여전히 넓게 개입할 수 있습니다.
  2. 핫 경로·짧은 타임아웃 — 가능한 한 좁은 syscall_set + (자식까지면) -f --seccomp-bpf를 검토합니다.
  3. 요약만 필요 — -c로 카운트만 보고 긴 트레이스를 피합니다.
  4. 생산 부하 — 상시 attach는 비용이 큽니다. 재현 창에만 짧게 켭니다.
# 자식 포함 + seccomp-bpf 시도 (환경에 따라 실패 가능)
strace -f --seccomp-bpf -e trace=%net -o net.log your-server

# 어떤 호출이 많은지 먼저
strace -c -e trace=%file your-app

자주 묻는 질문

-e open과 -e trace=open은 다른가?
아니요. qualifier 기본이 trace라서 같습니다.

!가 셸에서 깨진다.
history 확장 때문입니다. 따옴표나 \!로 이스케이프합니다.

전체 입문 글과 무엇이 다른가?
그쪽은 “무엇인가 / 시작 / attach” 축이고, 이 글은 필터 문법·%file/%net·성능만 다룹니다.

필터하면 항상 빨라지나?
출력은 줄어도, ptrace 개입 비용은 남을 수 있습니다. 멈출 집합을 줄이려면 man이 가리키는 --seccomp-bpf 조건을 확인합니다.

정리

**strace -e trace=**로 호출 집합을 고르고, 파일·네트워크는 **%file / %net**을 쓰며, 느려짐은 man대로 추적 자체의 비용이므로 필요 시 **--seccomp-bpf(와 -f)**를 검토합니다. 근거: strace(1). 제휴 없음.

공식 문서는 어디인가?