Translated message

A translation of this page exists in English.

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 로 대체함으로써 추적 할 수 있습니다.