> 패키지 및 시스템 관리 > strace

strace: 시스템 호출 및 시그널 추적

strace는 리눅스에서 프로세스가 수행하는 시스템 호출(syscall)과 수신하는 시그널을 추적하고 기록하는 강력한 진단 도구입니다. 이를 통해 프로그램이 커널과 어떻게 상호작용하는지 상세히 파악할 수 있어 디버깅, 성능 분석, 보안 감사 등에 유용하게 활용됩니다.

개요

strace는 특정 명령어를 실행하거나 이미 실행 중인 프로세스에 연결하여 해당 프로세스의 모든 시스템 호출과 시그널 이벤트를 실시간으로 출력합니다. 이는 파일 I/O, 네트워크 통신, 메모리 관리 등 프로그램의 저수준 동작을 이해하는 데 필수적입니다.

주요 기능

  • 프로세스의 시스템 호출 및 시그널 추적
  • 각 호출의 인자, 반환 값, 오류 코드 표시
  • 실행 중인 프로세스에 연결하여 추적
  • 자식 프로세스까지 함께 추적
  • 특정 시스템 호출 또는 시그널 필터링

주요 옵션

strace는 다양한 옵션을 통해 추적 방식과 출력 형식을 세밀하게 제어할 수 있습니다.

기본 추적 옵션

출력 제어

필터링

생성된 명령어:

명령어를 조합해 보세요.

설명:

`strace` 명령어를 실행합니다.

위 옵션들을 조합하여 AI와 함께 가상으로 명령어를 실행해 보세요.

사용 예시

strace를 활용한 다양한 사용 예시입니다.

간단한 명령어 추적

strace ls

`ls` 명령어의 시스템 호출을 추적합니다.

추적 결과를 파일로 저장

strace -o date_trace.log date

`date` 명령어의 시스템 호출을 `date_trace.log` 파일에 저장합니다.

실행 중인 프로세스 추적

strace -p 12345

PID가 12345인 프로세스에 연결하여 시스템 호출을 추적합니다. (PID는 실제 프로세스 ID로 대체해야 합니다.)

자식 프로세스까지 추적

strace -f bash -c "echo Hello, strace!"

`bash` 셸에서 `echo` 명령어를 실행할 때, `bash`와 `echo` 모두의 시스템 호출을 추적합니다.

특정 시스템 호출만 필터링

strace -e trace=open,read,write cat /etc/hosts

`cat /etc/hosts` 명령어가 `open`, `read`, `write` 시스템 호출을 사용하는지 추적합니다.

시스템 호출 소요 시간 확인

strace -T ls

각 시스템 호출에 소요된 시간을 함께 출력합니다.

설치

strace는 대부분의 리눅스 배포판에 기본으로 포함되어 있지 않을 수 있습니다. 다음 명령어를 사용하여 설치할 수 있습니다.

Debian/Ubuntu

sudo apt update && sudo apt install strace

APT 패키지 관리자를 사용하여 설치합니다.

CentOS/RHEL 7

sudo yum install strace

YUM 패키지 관리자를 사용하여 설치합니다.

Fedora/RHEL 8+

sudo dnf install strace

DNF 패키지 관리자를 사용하여 설치합니다.

팁 & 주의사항

strace는 강력하지만, 사용 시 몇 가지 고려할 사항이 있습니다.

성능 영향

strace는 프로세스의 시스템 호출을 가로채기 때문에, 추적 대상 프로그램의 성능에 상당한 영향을 줄 수 있습니다. 특히 I/O가 많은 프로그램의 경우 더욱 그렇습니다. 프로덕션 환경에서는 주의해서 사용해야 합니다.

출력 해석

strace의 출력은 매우 방대할 수 있으므로, 필요한 정보만 필터링(-e)하거나 파일로 저장(-o)하여 분석하는 것이 좋습니다. 특정 시스템 호출에 대한 자세한 정보는 `man 2 <syscall_name>` 명령어로 확인할 수 있습니다.

권한

다른 사용자의 프로세스를 추적하거나 시스템 전반의 동작을 추적하려면 `root` 권한이 필요합니다.

디버깅 도구와의 차이

strace는 시스템 호출 수준에서 동작하며, `gdb`와 같은 디버거와는 달리 프로그램 내부의 변수나 함수 호출을 직접 조작하거나 스택 트레이스를 볼 수는 없습니다. 두 도구는 상호 보완적으로 사용될 수 있습니다.


동일 카테고리 명령어