OS/LINUX

[명령어] strace 사용법

투칼론 2023. 8. 31. 20:43
반응형

소개

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 컨텍스트 데이터베이스와 비교하여 예기치 않은 컨텍스트를 표시

 

'OS > LINUX' 카테고리의 다른 글

[명령어] tar, gz 아카이브 및 추출  (0) 2023.09.05
[명령어] logrotate 로그 관리  (0) 2023.03.19
[명령어] stat 명령어  (0) 2023.01.12
[명령어] base64 명령어  (0) 2022.11.18
[명령어] file 명령어  (0) 2021.04.09