[명령어] strace 사용법
소개
strace는 시스템 콜과 시그널을 추적하는 데 사용됩니다. 이는 애플리케이션을 디버깅할 때 사용할 수 있는 훌륭한 도구이며 Red Hat 지원 엔지니어가 운영 체제와 해당 프로그램 내에서 발생할 수 있는 특정 문제를 검사하도록 요청하는 경우가 많습니다.
사용법
command 실행을 통해 발생한 시스템 콜을 기록하고, /tmp/strace.tx 파일에 추적 정보를 출력합니다.
RHEL 6.7+과 RHEL 7에서 strace 4.7 이상:
# strace -fvttTyy -s 256 -o /tmp/strace.txt command
RHEL 4, RHEL 5, and RHEL 6.6 또는 하위버전에서 strace 4.7 이하:
# strace -fvttT -s 256 -o /tmp/strace.txt command
-p [PID] 옵션과 함께 이미 기동되어 있는 프로세스에 연결할 수도 있습니다.
RHEL 6.7+과 RHEL 7에서 strace 4.7 이상:
# strace -fvttTyy -s 256 -o /tmp/strace.txt -p PID
RHEL 4, RHEL 5, and RHEL 6.6 또는 하위버전에서 strace 4.7 이하:
# strace -fvttT -s 256 -o /tmp/strace.txt -p PID
옵션
-f : 하위 프로세스가 동일한 파일에 캡처되고, 추적 출력에서 별도의 프로세스 앞에 해당 PID 번호를 추가 -v : 환경, 통계 및 유사한 호출의 verbose 버전을 출력 -tt : microsecond를 포함한 각 줄의 시작 시간을 출력 -T : 시스템 호출의 시작과 끝 사이의 시간을 표시 -yy : 파일 설명자 및 소켓과 관련된 경로를 출력(strace 4.7 이상에서 사용 가능). -s 256 : 문자열의 처음 256자를 출력함. 기본값 32는 유용한 정보가 누락되는 경우가 많음. -s 4096과 같은 큰 값은 프로세스 속도가 너무 느려지므로 권장하지 않음. 이는 사용자가 파일 콘텐츠 및/또는 전체 메시지를 보는 데 관심이 있는 특정 사용 사례로 제한되어야 함 -o /tmp/strace.txt : 회고적(retrospective) 분석을 위해 추적을 텍스트 파일로 출력. 출력이 긴 줄로 인해 커서 실시간 분석이 불가능하기 때문임 -e trace=set : 특정 시스템 호출을 추적할 수 있음. 예를들어, -e trace=open,close,read,write 는 기본값 -e trace=all |
성능 분석
strace는 데이터 수집 기간 동안 모든 시스템 호출 수 및 호출 시간 요약을 제공합니다.
이 모드는 -c 플래그로 활성화됩니다.
출력은 다음 예제의 형식을 따릅니다.
# strace -c -p PID Process PID attached - interrupt to quit ^CProcess PID detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.010116 66 153 select 0.00 0.000000 0 165 gettimeofday ------ ----------- ----------- --------- --------- ---------------- 100.00 0.010116 318 total |
출력 압축
매우 상세한 출력의 경우 추적 출력을 바로 압축하는 것이 좋을 수 있습니다.
bash 쉘 에서 다음 명령을 사용하여 수행할 수 있습니다.
# strace -fvttTyy -s 256 command 3>&1 1>&2 2>&3 3>&- | gzip -9c > strace.txt.gz
ksh, zsh, fish 또는 csh에서 리디렉션이 작동하지 않는 경우 명명된 파이프를 사용하는 다음 대체 명령도 작동합니다.
# mkfifo /tmp/catcher; cat /tmp/catcher | gzip -9c > /tmp/strace.txt.gz & strace -fvttTyy -s 4096 -o /tmp/catcher command
끝나면, named 파이프를 삭제해야 함
# rm -f /tmp/catcher
-p PID 옵션과 함께 커맨드를 통해 이미 실행 중인 프로세스를 추적할 수 있습니다.
Looping 컬렉션
strace 자체에는 여러 로그 파일로 "롤오버"할 수 있는 기능이 없지만 스크립트는 다음에 설명된 대로 이를 수행할 수 있습니다.
어떻게 하면 계속 strace를 실행할 수 있나요?
조사 중인 문제에 따라 strace 파일을 롤오버하면 파일 설명자 생성이 제거되어 문제 해결이 더 어렵거나 불가능해질 수 있습니다. 연결된 스크립트는 Loop 실행보다 짧은 시간 동안 FD가 열려 있는 상황에서만 사용해야 합니다.
SELinux 컨텍스트 출력
SELinux 지원 시스템에서는 최신 strace (RHEL8.4+)를 사용하여 다양한 구성 요소(예: 파일, 파일 설명자 등)의 컨텍스트와 함께 추적 중인 프로세스의 컨텍스트를 추가로 인쇄할 수 있습니다.
이는 다음 옵션을 추가하여 수행됩니다.
--secontext : SELinux 유형만 표시하려면(예: 프로세스를 위한 unconfined_t)
--secontext=full : 전체 SELinux 튜플을 표시하려면(예: 프로세스를 위한 unconfined_u:unconfined_r:unconfined_t:s0)
--secontext=mismatch : SELinux 유형만 표시하지만 SELinux 컨텍스트 데이터베이스와 비교하여 예기치 않은 컨텍스트를 표시