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=open | open만 |
-e trace=open,close,read,write | 나열한 호출만 |
-e trace=!open | open을 제외한 나머지 |
-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와 함께 쓸 때 의미가 있고,-pattach·일부 옵션과는 호환되지 않습니다.- 필터 설정에 실패하면 strace는 매 시스템콜마다 멈추는 기존 방식으로 진행합니다.
실무 해석:
trace=%file만 — 로그 I/O·가독성은 좋아집니다. 다만 seccomp-bpf가 없으면 커널/트레이서가 여전히 넓게 개입할 수 있습니다.- 핫 경로·짧은 타임아웃 — 가능한 한 좁은
syscall_set+ (자식까지면)-f --seccomp-bpf를 검토합니다. - 요약만 필요 —
-c로 카운트만 보고 긴 트레이스를 피합니다. - 생산 부하 — 상시 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). 제휴 없음.
공식 문서는 어디인가?
- strace(1) — Linux man-pages —
-e expr,-e trace=,%분류,--seccomp-bpf, BUGS - strace.io — 프로젝트 홈