strace는 리눅스에서 특정 프로그램(프로세스)의 시스템 콜이나 시그널을 추적하는 동적분석 도구이다. 해당 프로그램에 대한 소스코드가 없는 상황에서는 이렇게 직접 실행해가면서 어떤 변화가 발생하는지를 추적하는 것이 유일한 해법이다.


1. 실행파일 추적하기

가장 기본적인 방법이다. 리눅스에서 ls 명령어를 실행할 때 내부적으로 어떤 변화가 일어나는지 확인해보자.

순식간에 엄청난 일이 벌어진다. 하지만 전체 내용을 모두 다 감시하기에는 정보가 너무많다.


2. 특정 시스템 콜만 골라서 보기

위에서는 default로 strace의 모든 출력값을 보여주고 있었다. 이번에는 본인이 원하는 특정한 시스템콜만 -e 옵션으로 확인할 수 있다. 예를 들어 open과 관련된 내용만 보려면 아래와 같다.

이는 ls 명령어가 사용한 다양한 시스템 콜 중 open과 관련된 내용만 출력한 것이다. 혹시 여러개의 옵션을 주려면 아래와 같이 하면 된다.

3. 출력결과 파일로 저장하기

화면에 그냥 프린트된 내용을 분석하기는 쉽지 않다. 이것을 파일로 저장하고 그 파일을 분석하는 형태로 가야한다. > 키워드로 파일로 뽑을 수 있을 줄 알았는데 잘 안된다. 알고보니 -o 옵션으로 손쉽게 저장할 수 있었다.

4. 실행중인 프로세스를 분석하기

지금까지는 직접 ls 라는 명령어를 실행해가면서 테스트를 했다. 하지만 strace는 이미 실행중인 프로세스에 대해서도 분석이 가능하다. 단, PID 정보를 알고 있어야 한다. 먼저 ps -C 명령어로 원하는 프로세스의 PID 를 확인하자.

LunaAppManager라는 애플리케이션이 PID 519로 동작하고 있다. 이제 strace에  -p 옵션을 주어 해당 프로세스를 분석하고 그 결과를 텍스트 파일로 저장하자. (root 권한이 요구되는 경우 sudo 가 필요할 수 있다.)

attached 가 되었다는 메시지가 나오면, 아마 계속 진행중이므로 새로운 터미널을 열어야 할 것이다. 그리고 LauaAppManager.txt 파일을 tail 명령어로 조회해보자.

tail -f 로 켜놓으면 실시간으로 변화되는 로그기록을 지속적으로 조회할 수 있다. 


5. 시간정보 포함시키기

프로세스 작동을 관찰할 때 timestamp 정보를 포함하면 사건의 전후관계를 보다 명확히 파악할 수 있다. 이때 -t 옵션을 넣는다.

ㅋㅋ 근데 거의 1초안에 모든 작업이 이루어져서;; 보다 세밀한 비교기준이 필요할 것 같다.


6. 상대시간

그렇다면 이번에는 각각의 시스템콜이 작동하는 시간을 상대적으로 비교하기 위해 -r 옵션을 넣자

7. 통계내기

strace 의 -c 옵션을 사용하면, 각각을 trace 한 결과에 대한 통계를 도출해준다. calls 열을 보면 특정 시스템 콜을 얼마나 많이 호출했는지 등을 쉽게 확인할 수 있다.


참고 : http://www.thegeekstuff.com/2011/11/strace-examples/

CPUU님의 창작활동을 응원하고 싶으세요?