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.conf의hosts: files dns설정에 따라/etc/hosts먼저 확인 후 DNS 조회- strace에서 이 파일이 보이면 → 프로그램이 네트워크 연결을 시도하고 있다는 신호