strace 를 이용해서 명령어에 의한 시스템 콜들을 추적하기 위해서 어떻게 하면 됩니까?
업데이트됨 -
목차
소개
strace
명령어는 시스템 콜들과 시그널들을 추적하기 위해 사용됩니다. 어플리케이션을 디버깅할 때 사용하기 위한 훌륭한 도구이며 운영체제 및 해당 프로그램 내부에서 일어날 수 있는 특정 문제들을 검사하기 위해 Red Hat 기술지원 엔지니어들이 요청드리는 경우가 있습니다.
사용법
-
command
를 실행함으로서 발생한 시스템 콜들을 기록하기 위해/tmp/strace.txt
라고 불리는 파일로 추적 정보를 출력합니다, 다음을 실행하여 주십시요:- strace 4.7 또는 그 이상을 사용하는 RHEL 6.7+ 및 RHEL 7
# strace -fvttTyy -s 256 -o /tmp/strace.txt command
- 4.7 보다 낮은 strace 를 사용하는 이전 RHEL 릴리즈. 즉, RHEL 4, RHEL 5, 및 RHEL 6.6 또는 낮은 버젼의 모든 릴리즈를 포함하는 경우:
# strace -fvttT -s 256 -o /tmp/strace.txt command
-
-p
옵션과 프로세스의 PID를 사용하여 다음과 같이 이미 실행중인 프로세스에 연결할 수도 있습니다:- strace 4.7 또는 그 이상을 사용하는 RHEL 6.7+ 및 RHEL 7:
# strace -fvttTyy -s 256 -o /tmp/strace.txt -p PID
- 4.7 보다 낮은 strace 를 사용하는 이전 RHEL 릴리즈. 즉, RHEL 4, RHEL 5, 및 RHEL 6.6 또는 낮은 버젼의 모든 릴리즈를 포함하는 경우:
# strace -fvttT -s 256 -o /tmp/strace.txt -p PID
(여기서
PID
는 프로세스의 PID 번호로 대체됩니다.)
옵션들
위에서 사용된 옵션들은 추적들에 대한 정확성과 완성도를 높이기 위해 추가되었습니다.
옵션들은 다음과 같이 설명됩니다:
-f
는 자식 프로세스를 동일한 파일에 캡처하게하고, 추적 출력에서 별도의 프로세스들의 앞에는 PID 번호가 붙습니다-v
는 환경, 통계, 그리고 유사한 콜들의 생략되지 않은 버전들을 출력합니다-tt
는 각 라인의 마이크로 초를 포함한 시작 시간을 출력합니다-T
는 각 시스템 콜의 시작과 끝 사이의 시간을 보여줍니다-yy
는 파일 디스크립터들과 소켓들과 관련된 패스들을 출력합니다 (strace 4.7 및 이후 버젼에서 이용가능)-s 256
는 모든 스트링들의 첫번째 256 문자들을 출력합니다,32
의 기본값은 유용한 정보가 누락되는 것을 초래할 수 있습니다-o /tmp/strace.txt
는 출력이 길어서 실시간 분석이 어려울 수 있기 때문에 회귀 분석을 위해서 텍스트 파일에 추적을 출력합니다.-e trace=set
는 특정 시스템 콜들의 추적을 허용합니다, 예를 들어, 기본값인-e trace=all
대신-e trace=open,close,read,write
성능 분석
-
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 256 -o /tmp/catcher command
- 끝낼 때, 이름 파이프를 제거하여 주십시요.
# rm -f /tmp/catcher
- 두 예제 모두에서 이미 실행중인 프로세스는
command
를-p PID
로 대체함으로써 추적 할 수 있습니다.
Comments