strace

1. 개요

strace는 프로세스가 커널에 요청하는 시스템 콜(system call) 을 실시간으로 추적하는 도구.
내부적으로 ptrace() 시스템 콜을 이용해 user space → kernel space 전환 시점을 가로챔.

User Space  →  syscall  →  Kernel Space
               ↑
            strace가 ptrace()로 가로챔

2. 주요 시스템 콜

시스템 콜 의미
open() / openat() 파일 열기
read() / write() 파일/소켓 I/O
mmap() / mprotect() 메모리 매핑
clone() / fork() 프로세스/스레드 생성
futex() 유저스페이스 뮤텍스(락)
epoll_wait() I/O 이벤트 대기
brk() / sbrk() 힙 영역 확장
execve() 프로세스 이미지 교체

3. 주요 옵션

strace ./my_program                        # 실행하면서 추적
strace -p <PID>                            # 실행 중인 프로세스에 붙기
strace -e trace=openat,read,write ./prog   # 특정 syscall만 필터링
strace -T -t ./my_program                  # 시간 정보 포함
strace -f ./my_program                     # 자식 프로세스까지 추적

4. fork-exec 패턴

bash에서 명령 실행 시 fork() + execve() 조합으로 새 프로세스 생성.

bash (PID 100)
    │
    ├─ fork()
    │      │
    │  [child (PID 101)]
    │      └─ execve("/bin/ls", ...)   ← 메모리 이미지 완전 교체
    │              │
    │          ls 실행 후 exit()
    │
    └─ wait() → 자식 종료 감지 → 프롬프트 재출력
단계 동작
fork() 부모 프로세스 복사. PID만 다른 동일 프로세스 생성
execve() 자식의 메모리 이미지를 새 바이너리로 완전 교체. 호출 성공 시 돌아오지 않음
wait() 부모(bash)가 자식 종료까지 블로킹
fork()는 glibc wrapper. 실제 커널 내부 구현은 clone() 시스템 콜.

strace로 확인:

strace -e trace=clone,execve,wait4 bash -c "ls"

5. open("/etc/resolv.conf")

strace 추적 시 자주 등장하는 파일. DNS 리졸버 설정 파일.

프로그램
    └─ getaddrinfo("google.com")    ← glibc 함수
              └─ open("/etc/resolv.conf")   ← DNS 서버 주소 확인
                        └─ DNS 쿼리 (UDP 53)
                                  └─ IP 반환
  • getaddrinfo() / gethostbyname() 호출 시 glibc 내부에서 자동으로 읽음
  • /etc/nsswitch.confhosts: files dns 설정에 따라 /etc/hosts 먼저 확인 후 DNS 조회
  • strace에서 이 파일이 보이면 → 프로그램이 네트워크 연결을 시도하고 있다는 신호