본문 바로가기
LINUX

[linux] Strace 에 대해 알아보자!

by Rainbound-IT 2024. 12. 16.
반응형

strace는 리눅스 환경에서 **시스템 호출(system calls)**과 **신호(signals)**를 추적하기 위한 디버깅 도구입니다. 주로 프로세스의 동작을 분석하거나 디버깅할 때 사용됩니다.


1. strace란?

  • System Trace의 줄임말로, 실행 중인 프로세스가 커널과 상호작용하는 방식을 추적합니다.
  • 프로그램이 실행 중에 호출하는 **시스템 호출(syscall)**과 **받는 신호(signals)**를 기록하고 출력합니다.

2. strace의 주요 기능

  1. 시스템 호출 추적
    • 파일 읽기/쓰기, 네트워크 요청, 메모리 할당 등 프로세스가 호출하는 모든 시스템 호출을 추적할 수 있습니다.
    • 예: open, read, write, socket, mmap 등.
  2. 프로세스 디버깅
    • 프로세스가 비정상적으로 작동하거나 멈췄을 때, 어떤 시스템 호출에서 문제가 발생했는지 확인할 수 있습니다.
  3. 신호 처리 추적
    • 프로세스가 수신하거나 처리하는 신호(SIGKILL, SIGSEGV 등)를 확인할 수 있습니다.
  4. 성능 및 동작 분석
    • 프로그램이 의도한 대로 시스템 자원을 사용하는지 확인할 수 있습니다.
    • 병목현상이나 비효율적인 동작의 원인을 찾는 데 유용합니다.

3. strace의 주요 사용 사례

  1. 파일 입출력 분석
    • 어떤 파일을 열거나 읽는지, 또는 파일 접근이 실패했는지 확인.
  2. 네트워크 호출 확인
    • 네트워크 소켓을 열거나 데이터를 전송하는지 추적.
  3. 프로세스 중단 원인 조사
    • 특정 시스템 호출에서 멈추거나 오류가 발생하는지 확인.
  4. 동적 라이브러리 문제 해결
    • 실행 파일이 의존하는 동적 라이브러리가 제대로 로드되는지 확인.
  5. 권한 문제 해결
    • 프로세스가 필요한 파일이나 디렉토리에 접근할 수 없는 경우 문제를 파악.

4. strace 명령어 사용법

기본 구문은 다음과 같습니다:

strace [옵션] <명령어> [명령어의 인자]

4.1 기본 사용

strace ls
  • ls 명령어가 실행되면서 호출하는 모든 시스템 호출을 출력.

4.2 특정 시스템 호출만 추적

strace -e trace=open,read,write ls
  • open, read, write와 관련된 시스템 호출만 출력.

4.3 프로세스 ID를 지정하여 추적

strace -p <PID>
  • 이미 실행 중인 프로세스(PID)를 추적.

4.4 출력을 파일로 저장

strace -o output.txt ls
  • 결과를 output.txt 파일에 저장.

4.5 시간 측정

strace -T ls
 
  • 각 시스템 호출이 실행되는 데 걸린 시간을 출력.

4.6 신호 추적

strace -e signal ls
  • 프로세스가 받는 신호를 추적.

4.7 시스템 호출 실패만 출력

 
strace -e fault ls
  • 실패한 시스템 호출만 표시.

5. strace 출력 해석

출력 형식은 일반적으로 다음과 같습니다:

openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0"..., 832) = 832 close(3) = 0
  • openat: 호출된 시스템 호출 이름.
  • (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC): 시스템 호출의 인자.
    • 여기서 /etc/ld.so.cache는 열려는 파일.
  • = 3: 시스템 호출의 반환 값. 파일 디스크립터 3을 반환.
  • read: 파일 디스크립터 3에서 데이터를 읽음.
  • close(3): 파일 디스크립터 3을 닫음.

6. 주의사항

  1. 오버헤드 발생
    • strace는 모든 시스템 호출을 기록하므로 성능에 영향을 줄 수 있습니다.
      대규모 프로그램에서 사용 시 주의해야 합니다.
  2. 출력량이 많음
    • 시스템 호출 로그가 방대할 수 있으므로, 특정 호출만 필터링하거나 출력을 파일에 저장하는 것이 좋습니다.
  3. 루트 권한 필요
    • 다른 사용자의 프로세스를 추적하려면 루트 권한이 필요합니다.

7. 비슷한 도구

  • ltrace: 시스템 호출 대신 라이브러리 호출을 추적.
  • gdb: 디버거로, 프로세스를 중단하고 내부 상태를 조사.
  • perf: 성능 분석 도구.

8. 예제

파일 접근 문제 디버깅:

 
strace -e trace=open ls /nonexistentfile

출력 예:

openat(AT_FDCWD, "/nonexistentfile", O_RDONLY) = -1 ENOENT (No such file or directory)
  • ENOENT 오류를 통해 파일이 없음을 확인.

요약

  • strace는 리눅스에서 시스템 호출과 신호를 추적하는 강력한 디버깅 도구입니다.
  • 디버깅, 성능 분석, 파일/네트워크 문제 해결에 유용합니다.
  • 사용법은 간단하지만, 출력 해석과 필터링을 적절히 활용해야 효율적으로 사용할 수 있습니다.
반응형

댓글