Linux

[리눅스] strace 명령어 완벽 가이드 사용법(프로세스 추적)

인생아 2024. 10. 19. 13:23
반응형

리눅스에서 strace 명령어는 프로세스가 호출하는 시스템 콜과 신호를 추적하는 강력한 도구입니다. strace를 사용하면 프로그램이 커널과 어떻게 상호작용하는지를 실시간으로 분석할 수 있습니다. 특히, 디버깅이나 성능 분석, 특정 오류의 원인을 파악할 때 매우 유용합니다. 예를 들어, 프로그램이 예상대로 실행되지 않거나 파일 입출력 문제를 일으킬 때 strace를 통해 시스템 콜을 추적하면 원인을 찾을 수 있습니다.

strace 기본 사용법

strace [옵션] [프로그램]

strace는 프로그램 실행과 동시에 해당 프로그램이 호출하는 시스템 콜을 실시간으로 출력해 줍니다. 예를 들어, ls 명령어의 시스템 콜을 추적하려면 다음과 같이 실행할 수 있습니다.

user@linux:~$ strace ls
execve("/bin/ls", ["ls"], 0x7ffc8d2a6d80 /* 59 vars */) = 0
brk(NULL)                               = 0x558c1fddf000
arch_prctl(ARCH_SET_FS, 0x7f0e63e34b40) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
...

이와 같이 stracels 명령어가 실행되면서 호출하는 시스템 콜을 한 줄씩 출력합니다. 여기서 openat()은 파일을 여는 시스템 콜이고, "."은 현재 디렉토리입니다.

특정 PID를 추적하는 방법

이미 실행 중인 프로세스를 추적하려면 -p 옵션을 사용하여 프로세스 ID (PID)를 지정할 수 있습니다. 예를 들어, PID가 1234인 프로세스를 추적하려면 다음과 같이 입력합니다.

user@linux:~$ strace -p 1234
strace: Process 1234 attached
recvfrom(3, "HTTP/1.1 200 OK\r\n", 4096, 0, NULL, NULL) = 17
...

이 명령어는 PID 1234 프로세스가 호출하는 시스템 콜을 추적하고 그 결과를 실시간으로 출력합니다.

strace 주요 옵션

  • -p [PID]: 특정 프로세스를 추적
  • -o [파일명]: 결과를 파일로 저장
  • -c: 시스템 콜 통계 출력
  • -e [표현식]: 특정 시스템 콜만 필터링하여 추적

시스템 콜 필터링

-e 옵션을 사용하면 특정 시스템 콜만 필터링할 수 있습니다. 예를 들어, 파일 열기와 관련된 시스템 콜만 추적하려면 open과 관련된 콜만 필터링할 수 있습니다.

user@linux:~$ strace -e open,openat ls
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
...

이 예제에서는 openopenat 시스템 콜만 출력됩니다. 이 방법을 통해 많은 양의 출력 중에서 필요한 정보를 빠르게 찾을 수 있습니다.

결과를 파일로 저장

출력 결과를 화면에 표시하는 대신 파일로 저장하고 싶을 때는 -o 옵션을 사용합니다. 예를 들어, strace 결과를 trace.log 파일에 저장하려면 다음과 같이 입력합니다.

user@linux:~$ strace -o trace.log ls

strace 실행 예제

다음은 strace를 사용하여 ls 명령어의 시스템 콜을 추적하는 예제입니다.

user@linux:~/projects$ strace ls
execve("/bin/ls", ["ls"], 0x7ffc8d2a6d80 /* 59 vars */) = 0
brk(NULL)                               = 0x558c1fddf000
arch_prctl(ARCH_SET_FS, 0x7f0e63e34b40) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
getdents64(3, /* 22 entries */, 32768)  = 488
close(3)                                = 0
munmap(0x7f0e64085000, 32768)           = 0
...

이 명령어는 ls가 실행되면서 호출하는 시스템 콜의 전체 흐름을 보여줍니다. 이를 통해 프로그램이 어떤 파일을 열고, 읽고, 닫는지와 같은 중요한 정보를 얻을 수 있습니다.

strace 사용 시 유용한 팁

  1. 디버깅: 프로그램이 제대로 작동하지 않을 때 strace로 시스템 콜을 분석하여 문제를 찾을 수 있습니다.
  2. 성능 분석: 프로그램이 느리게 실행되는 원인을 시스템 콜을 통해 분석할 수 있습니다.
  3. 파일 입출력 분석: 프로그램이 어떤 파일을 열고 닫는지 추적하여 파일 입출력 문제를 해결할 수 있습니다.

참고사이트

반응형