strace는 Linux에서 시스템 호출 및 신호를 추적하는 유틸리티입니다. 이를 통해 프로그램이 어떤 시스템 호출을 수행하는지, 어떤 파일을 열고 읽고 쓰는지, 네트워크 통신을 하는지 등을 분석할 수 있습니다. 이는 디버깅 및 성능 최적화, 문제 해결에 매우 유용합니다.
strace 기본 사용법strace [옵션] [프로그램] [인수...]
-o 파일: 출력을 지정한 파일로 저장합니다.-e expr: 추적할 이벤트를 지정합니다. 예를 들어, -e trace=read,write는 read와 write 시스템 호출만 추적합니다.-p PID: 이미 실행 중인 프로세스를 추적합니다.-c: 시스템 호출 요약을 제공합니다.-f: 자식 프로세스도 추적합니다.-r: 시스템 호출 전후의 상대적인 시간 간격을 표시합니다.-t: 각 시스템 호출의 타임스탬프를 표시합니다.-v: 시스템 호출의 모든 인수를 상세하게 표시합니다.프로그램 실행 추적
strace ls
출력을 파일로 저장
strace -o output.txt ls
특정 시스템 호출만 추적
strace -e trace=open,read,write ls
이미 실행 중인 프로세스 추적
strace -p 1234
자식 프로세스도 추적
strace -f ls
시스템 호출 요약
strace -c ls
상대 시간 간격 표시
strace -r ls
타임스탬프 표시
strace -t ls
모든 인수 상세 표시
strace -v ls
네트워크 프로그램 디버깅
네트워크 프로그램이 특정 호스트에 연결되지 않는 문제를 디버깅할 때 유용합니다.
strace -e trace=network curl http://example.com
파일 접근 문제 해결
파일이 존재하는데도 프로그램이 파일을 찾지 못할 때, 어떤 경로를 검색하는지 확인할 수 있습니다.
strace -e trace=file ls /nonexistentfile
프로세스가 무한 루프에 빠졌을 때
프로세스가 어떤 시스템 호출을 반복해서 수행하는지 확인할 수 있습니다.
strace -p 1234 -r -t
strace의 출력 해석strace의 출력은 시스템 호출의 순서와 그에 대한 응답을 보여줍니다. 예를 들어:
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
이 라인은 open 시스템 호출이 /etc/ld.so.cache 파일을 읽기 전용으로 열려고 시도했고, 파일 디스크립터 3을 반환했다는 것을 의미합니다.
strace는 시스템 호출의 실패 원인도 표시합니다:
open("/nonexistentfile", O_RDONLY) = -1 ENOENT (No such file or directory)
이 경우, open 호출이 ENOENT 오류로 실패했음을 나타내며, 이는 해당 파일이 존재하지 않는다는 의미입니다.
strace를 통해 시스템 호출을 추적하면 프로그램의 내부 동작을 더 잘 이해할 수 있으며, 문제 해결과 성능 최적화에 큰 도움이 됩니다.