본문 바로가기
CS

strace 를 이용한 프로세스 모니터링 - 디버깅 빠르게 하는 방법

by Warehaus 2024. 6. 6.

사진: Unsplash 의 Clément Hélardot

 

 

안녕하세요

오늘은 strace를 이용한 프로세스 모니터링 방법에 대해 알려드리겠습니다.

 

근래 코딩 국비 지원 프로그램들 쿼리큘럼을 훑어보고 있는데, 이런 사소한 명령어에 대한 도구 사용법은 잘 다뤄지지 않는 듯하여 포스팅을 남겨봅니다.

 

저도 아직 제대로 다 본 것은 아니지만 프로그래밍 국비 지원 과정은 대부분 시스템 보다는 웹/앱 개발에 치중된 경향이 있어 보입니다.

 

무튼, 오늘 주제는 strace도구 사용법 입니다.

 

 

저는 네이버 엑스퍼트에서 합리적인 가격으로 C++/ Python 관련한 코드문제를 해결해 드리고 있습니다. 관심이 있으시다면 상담요청을 진행 해 주세요.  요청하시는 일정 내 해결이 가능한 문제라면 최선을 다해 도움을 드리겠습니다.

 

https://m.expert.naver.com/mobile/expert/product/detail?storeId=100049535&productId=100136977

 

[음성/문자 상담 30분] C++, Python 코드 및 과제상담 : 네이버 엑스퍼트

엑스퍼트: Notice ​ C++, python 에 대한 코드 리뷰, 오류수정 및 문제풀이 상담 가능합니다. 내용은 메일로 사전 전달해주시면 빠르게 상담진행이 가능합니다. ​ ​ ...

m.expert.naver.com

 

 

strace

 

strace is a useful diagnostic, instructional, and debugging tool. System administrators, diagnosticians and trouble-shooters will find it invaluable for solving problems with programs for which the source is not readily available since they do not need to be recompiled in order to trace them.

 

 

Strace는 프로세스를 디버깅, 진단하기 위해 사용하는 알려진 도구입니다. 시스템 호출과 시그널 추적이 가능하며 이는 프로세스가 커널과 상호작용하는 방식을 추적함으로써 가능합니다.

 

 

strace 사용법

[ strace 사용 기초 ]

 

이제 strace의 기능을 알아보겠습니다.  strace에서 제공하는 옵션 리스트는 다음과 같습니다.

$ strace -h
Usage: strace [-ACdffhikqqrtttTvVwxxyyzZ] [-I N] [-b execve] [-e EXPR]...
              [-a COLUMN] [-o FILE] [-s STRSIZE] [-X FORMAT] [-P PATH]...
              [-p PID]... [--seccomp-bpf]
              { -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }
   or: strace -c[dfwzZ] [-I N] [-b execve] [-e EXPR]... [-O OVERHEAD]
              [-S SORTBY] [-P PATH]... [-p PID]... [--seccomp-bpf]
              { -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }

 

옵션이 꽤나 많은데 실무에서 자주 사용되는 옵션 위주로 설명을 드리는 게 좋을 것 같습니다.

유용한 옵션을 설명드리고 실제 사용사례를 통해 해당 옵션이 왜 유용한지 설명드릴게요.

 

 

myprogam

 

strace를 사용해 보기 전에 임시로 프로그램을 하나 만들어 보겠습니다.

Test 용 코드이고 특별히 하는 동작은 없습니다.

$ cat myprogram 
#!/bin/bash

for i in {1..100}
do
    echo $i
    sleep $i
done

 

유용한 옵션

 

1. 시스템 호출 추적


   - `strace`는 프로그램이 호출하는 모든 시스템 호출을 모니터링하고 그 결과를 출력합니다. 이는 프로그램이 파일을 열거나, 네트워크에 접속하거나, 메모리를 할당하는 등의 작업을 할 때 유용합니다.

 

strace -e trace=open,read,write ./myprogram

 

명령어를 실행하면 아래와 같은 출력이 나타납니다.

$ strace -e trace=open,read,write ./myprogram
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \347\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \22\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300A\2\0\0\0\0\0"..., 832) = 832
read(3, "#!/bin/bash\n\nfor i in {1..100}\nd"..., 80) = 64
read(255, "#!/bin/bash\n\nfor i in {1..100}\nd"..., 64) = 64
write(1, "1\n", 21
)                      = 2
read(3, "\36\2%\0&\0\17\0\235\1\356\5xterm-256color|xterm"..., 32768) = 3503
read(3, "", 28672)                      = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8428, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "2\n", 22
)                      = 2
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8429, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "3\n", 23
)                      = 2
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8430, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "4\n", 24
)                      = 2
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8431, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "5\n", 25

...




2. 프로세스 실행 추적

 

특정 프로그램을 실행하면서 해당 프로그램의 시스템 호출을 실시간으로 추적할 수 있습니다.

 

strace ./myprogram



3. 이미 실행 중인 프로세스 추적

- 이미 실행 중인 프로세스의 PID를 지정하여 그 프로세스의 시스템 호출을 추적할 수 있습니다.

strace -p 1234

 

 

4. 출력 포맷 지정

- `strace`는 다양한 옵션을 통해 출력 포맷을 지정할 수 있습니다. 예를 들어, 시스템 호출의 시간이나 프로세스 ID를 포함할 수 있습니다.

strace -t -p 1234

 

 

5. 호출 필터링

- 특정 시스템 호출만 필터링하여 추적할 수 있습니다.

strace -e trace=open,read,write ./myprogram



6. 시스템 호출 통계

 

- 각 시스템 호출의 빈도와 실행 시간을 요약하여 보여줄 수 있습니다.

strace -c ./myprogram




사용 예시

 

1. 기본 사용법 : 프로그램의 모든 시스템 호출을 추적합니다.

strace ls

 

 

 

2. 특정 시스템 호출 추적

$ strace -e trace=open ls
a.out  makefile  myprogram  p1.cc  p2.cc  ptr.cc  test.cc  test.copied.cc  threads.cc
+++ exited with 0 +++

 

 

3. 실행 중인 프로세스 추적 / 시간정보 포함하기 ( -t, -p 옵션 )

$ sudo strace -t -p 2143
strace: Process 2143 attached
23:05:33 restart_syscall(<... resuming interrupted read ...>

활용

 

기본적인 활용예시는 위에서 모두 다룬 것 같습니다.

strace는 현재 수행 중인 프로세스가 어떤 시스템 콜을 호출하고 있는지, 해당 시스템 콜 성능이 기대하는 수준으로 나오고 있는지를 분석 가능합니다.

 

저 같은 경우 이런 디버깅 외 별도의 사용케이스가 있는데요. 특정 프로세스의 응답이 기대한 것보다 늦게 오는 경우에 제가 수행한 프로세스가 정상적으로 실행 중인지, 멈춘 것인지 잘 모르는 상황이 있습니다.

 

이럴 때 해당 프로세스에 strace를 붙여보세요.

strace에서 별다른 system call 호출이 출력되지 않는다면 프로세스를 중단하고 문제를 분석해 보시는 게 좋습니다.

 

 

마치며

 

오늘은 strace를 이용한 프로세스 디버깅 방법에 대해 알아보았습니다.

사실 디버깅 도구라는 게 문제가 생기기 전에 미리 알아두기가 쉽지는 않습니다.

항상 문제를 겪고 나서 이런 문제를 어떻게 쉽게 해결할 수 있을까?라는 고민에서 이런 도구를 찾게 되는 것 같습니다.

 

그 말인 즉, 실제로 처음 문제를 겪었을 때에는 문제 해결 속도가 현저하게 느리다는 얘기입니다.

 

개인적으로는 문제해결 과정에서 겪었던 어려운 점이 이런 디버깅 툴을 활용하는 데 있어 가장 큰 동기부여가 아닐까 싶습니다. 이 글을 찾아오신 분들이라면 앞으로 더 빠르게 문제를 해결해 나가는 본인의 모습을 보게 되실 것이라 생각합니다.

우선 축하드리면서

 

이만 글을 마무리하겠습니다.