strace는 리눅스에서 사용되는 디버깅 및 시스템 호출 추적 도구로, 실행 중인 프로세스가 시스템 호출을 어떻게 사용하는지 추적하고 분석하는 기능을 제공한다. strace를 사용하면 프로그램이 시스템 호출을 호출하고 반환하는 모든 상세한 정보를 확인할 수 있으며, 이를 통해 소프트웨어 개발자는 프로그램의 동작과 성능을 이해하고 문제를 해결할 수 있다. 이번 글에서는 strace의 기본적인 사용법과 몇 가지 유용한 옵션에 대해 알아본다.
strace 기본 사용법
strace는 명령줄에서 사용되며, 추적하려는 프로그램과 그 인자를 함께 지정합니다. 다음은 strace를 사용하여 “example”이라는 실행 파일을 추적하는 예제입니다.
$ strace ./example
위 명령은 “example” 프로그램을 실행하면서 해당 프로그램이 사용하는 시스템 호출을 추적한다. strace는 추적 결과를 실시간으로 출력하여 프로그램이 실행되는 동안 추적 정보를 보여준다.
strace 주요 Option
strace는 다양한 옵션을 제공하여 사용자의 추적 요구에 맞게 설정할 수 있다. 몇 가지 유용한 옵션은 다음과 같다.
-e <syscall>
: 특정 시스템 호출만 추적한다. 예를 들어,-e openat
은 openat 시스템 호출만 추적한다.-f
: 자식 프로세스에서 발생하는 시스템 호출도 추적한다.-o <output_file>
: 추적 결과를 파일로 저장한다.-s <size>
: 문자열 인자의 최대 크기를 지정한다..-t
: 시간 정보를 출력한다.
이 외에도 strace는 다양한 옵션을 제공하므로, man strace
명령을 통해 상세한 도움말을 확인할 수 있습니다.
Example
다음은 “Hello, World!”를 출력하고, 파일을 열고 닫는 시스템 호출을 수행하는 간단한 C 프로그램의 예제이다.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <unistd.h>
int main()
{
printf("Hello, World!\n");
int fd = open("strace_ex.c", O_RDONLY);
close(fd);
return 0;
}
아래는 위의 예제 코드를 컴파일하여 “a.out”이라는 실행 파일을 생성한 후, strace를 사용하여 해당 프로그램을 추적한 결과이다.
$ gcc strace_ex.c
$ strace ./a.out
execve("./a.out", ["./a.out"], 0x7ffea8a5a6b0 /* 16 vars */) = 0
brk(NULL) = 0x5607a950a000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffcb4547a10) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
write(1, "Hello, World!\n", 14Hello, World!
) = 14
openat(AT_FDCWD, "strace_ex.c", O_RDONLY) = 3
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
출력 결과에서는 strace가 프로그램의 시스템 호출을 추적하고, 호출된 함수와 해당 함수의 인자, 반환 값 등을 보여준다. 위의 예제에서는 openat과 close 시스템 호출을 확인할 수 있다.