strace, 프로세스가 어떤 시스템 콜을 내는지 보는 법

strace는 프로세스가 커널에 요청하는 시스템 콜과 그 결과를 출력하는 추적 도구입니다.

이 글은 Linux man-pages의 strace(1)과 프로젝트 홈페이지를 2026-09-01 기준으로 정리한 일반 설명이며, 커널과 도구 버전에 따라 세부 동작은 달라질 수 있습니다.

strace는 무엇인가?

한 줄 답: 이 도구는 프로세스가 만드는 시스템 콜과 수신하는 시그널을 가로채 기록하고, 호출 이름·인수·반환값을 출력합니다.

가장 단순한 사용에서는 지정한 명령이 종료될 때까지 실행합니다. 프로세스가 만든 시스템 콜과 수신한 시그널을 기록하며, 각 줄에는 호출 이름, 괄호 안 인수, 반환값이 표시됩니다.

  • 기본 출력 대상은 표준 오류입니다.
  • -o를 지정하면 파일로 바꿀 수 있습니다.

반환값이 -1인 오류 호출에는 errno 기호와 오류 문자열이 뒤따를 수 있습니다. 예를 들어 다음 출력은 파일을 읽기 전용으로 열려 했지만 파일이 없어 ENOENT가 반환된 경우입니다.

open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

시그널은 시그널 기호와 해석된 siginfo 구조로 표시됩니다. 이 도구는 Linux 사용자 공간의 진단·학습·디버깅용 유틸리티이며, 커널 기능인 ptrace를 바탕으로 동작합니다. gdb는 프로그램 안을 검사하고, 이 도구는 시스템 콜을 추적합니다.

어떻게 시작하나?

한 줄 답: 실행할 명령 앞에 이 실행 파일을 두면 대상이 끝날 때까지 추적하며, 기본 출력은 표준 오류로 갑니다.

사용 형식은 다음과 같으며, 이 절에서는 새 명령을 실행하는 경로를 다룹니다.

strace [options] { -p pid | command [args] }

명령을 화면에서 추적하려면 다음처럼 실행합니다. 두 번째 명령은 기본 표준 오류 대신 trace.log 파일에 결과를 기록합니다.

strace cat /dev/null
strace -o trace.log cat /dev/null
  • -o file 또는 --output=filename은 추적 결과를 지정한 파일에 쓰는 옵션입니다.
  • 지정한 명령은 셸을 거치지 않고 직접 실행되므로, shebang이 없는 스크립트는 ENOEXEC로 실패할 수 있습니다.
  • 자식 프로세스까지 함께 보려면 -f 또는 --follow-forks를 사용합니다.

특정 시스템 콜만 보려면?

한 줄 답: -e trace= 또는 --trace= 뒤에 호출 이름이나 현재 권장되는 % 분류를 넣어 보고 싶은 범위만 고릅니다.

-e expr은 추적할 이벤트를 바꾸며, qualifier를 생략하면 기본값은 trace입니다. 따라서 -e open-e trace=open과 같고, -e trace=!openopen을 제외한 시스템 콜을 추적합니다.

호출 이름 하나, 쉼표로 나열한 호출 목록, 파일 관련 호출을 묶는 %file을 다음처럼 지정할 수 있습니다.

strace -e trace=open cat /dev/null
strace -e trace=open,close,read,write cat /dev/null
strace --trace=%file cat /dev/null

주요 호출을 묶어서 고를 수 있는 % 분류는 다음과 같습니다.

  • %file: 파일 이름을 인수로 받는 호출
  • %network 또는 %net: 네트워크 관련 호출
  • %process: 프로세스 생성·exec·종료 관련 호출

문서에 있는 % 없는 file, network, process 형식은 deprecated로 표시되어 있으므로 현재 예시에서는 % 형식을 우선합니다. 일부 호출만 기록하면 기록되지 않은 호출까지 포함한 전체 동작을 판단하기 어려우므로, 필터 범위를 확인한 뒤 결과를 해석해야 합니다.

이미 실행 중인 프로세스에는 어떻게 붙이나?

한 줄 답: -p PID 또는 --attach=PID를 사용하면 이미 실행 중인 해당 프로세스에 붙어 이후의 호출을 추적합니다.

실행 중인 프로세스의 PID가 26380이라면 다음과 같이 지정합니다.

strace -p 26380
strace: Process 26380 attached
  • 추적을 끝낼 때 Ctrl-C를 누르면 이 도구는 추적 대상에서 분리되고, 대상 프로세스는 계속 실행됩니다.
  • 하나 이상의 -p 옵션을 사용하면 command는 선택 사항이며, 여러 -p 옵션을 쓰거나 하나의 -p에 쉼표·공백·탭·줄바꿈으로 구분한 여러 PID를 지정할 수도 있습니다.

FAQ

한 줄 답: 명령을 새로 실행하거나 실행 중인 PID에 붙은 뒤, 필요한 호출만 골라 결과의 반환값을 확인하면 됩니다.

Linux에서 프로세스가 어떤 시스템 콜을 내는지 보려면 무엇을 쓰나? 새 명령이면 명령 앞에 이 실행 파일을 두고, 이미 실행 중이면 -p PID로 붙습니다. 필요한 경우 -e trace=로 범위를 좁힙니다.

출력은 어디에 쌓이나? 기본 출력은 표준 오류로 전달됩니다. -o trace.log 또는 --output=filename을 사용하면 지정한 파일에 기록됩니다.

자식 프로세스까지 따라가나? 기본 추적과 구분해 -f 또는 --follow-forks를 사용하면 fork·vfork·clone으로 생성된 자식 프로세스도 함께 추적합니다.

-p로 붙이면 대상이 멈추나? Ctrl-C로 추적을 끊으면 이 도구는 대상에서 분리되고 대상 프로세스는 계속 실행됩니다. 일부 플랫폼에서는 attach된 프로세스가 재시작할 수 없는 시스템 콜에서 일시적인 EINTR을 받을 수 있다는 주의가 man page에 있습니다.

출처

한 줄 답: 본문 사실과 예시는 2026-09-01 기준으로 확인한 Linux man-pages와 프로젝트 홈페이지를 사용합니다.

  • strace(1) — Linux manual page — 목적, 기본 출력, 호출·오류 표시, -o, -e trace, % 분류, -p, Ctrl-C detach, -f와 관련 주의를 확인했습니다.
  • strace.io — Linux 사용자 공간 진단·디버깅·학습용 유틸리티라는 성격과 ptrace 기반 동작을 확인했습니다.