Skip to content

Strace - 시스템콜과 신호 추적

조회 수 6106 추천 수 0 2014.02.25 11:10:10
strace는 system-call Tracer를 의미하는 말로, strace에 의해 추적되는 프로세스의
시스템콜, 신호를 모두 화면에 출력한다.
(시스템콜 ex : read,write,exit,lstat,ipc,fork.... 대부분 표준 C 라이브러리 내에 함수로 존재)

strace 프로그램은 ptrace라는 시스템콜을 사용하여 자식 프로세스가
어떤 시스템 콜을 호출하는지 감시하고, 호출하는 시스템 콜에 대해 화면에 출력한다.

:: 시스템콜 실패시 strace를 이용하면 어떤 시스템콜이 실패하였는지 쉽게 알아낼 수 있다.
:: 예외처리를 해준다면 더욱 쉽게 알아낼 수 있을 것이다.


일단 strace 유틸리티로 추적해볼 프로그램을 만들어보자.

/*
 *   gcc scall.c -o scall
 *   굵게 표시된 부분은 시스템콜을 의미
 *   아무 의미 없지만, 마구잡이로 시스템콜을 써먹은 예제입니다.
 */

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

int main(void){

    pid_t pid = fork();

    if(pid == 0)
        exit(0);

    int p[2];
    pipe(p);

    int a = open("/dev/null",O_RDONLY);
    int b = open("./diary",O_RDONLY);

    return 0;
}


strace.png



주황색으로 줄친부분 외에, 그 윗부분은 공유 라이브러리를 링크하는 부분으로,
동적 링크가 커널에게 요청한 시스템 콜로 신경쓸 필요 없다.



프로그래머가 입력한 시스템콜은 그 아래에 나타난다.

clone() :: fork()는 내부적으로 clone() 이라는 시스템콜을 호출한다.
SIGCHLD :: 자식 프로세스로부터 신호가 추적됨. (종료코드 0 :: exit(0) )
pipe() :: pipe() 시스템콜을 사용한것을 알 수 있다.
open("/dev/null",~~~~) :: /dev/null을 가리키는 파일 서술자의 값이 5임을 알 수 있다.
open("./diary",~~~) 뒷쪽에 No such file or directory 라는 글이 보이진 않지만,
strace를 통해 diary라는 파일을 open() 시스템콜로 찾는다는 것과,
그 파일이 존재하지 않음을 알 수 있다.




옵션/

-c :: time, second, usecs/call, calls, errors, syscall 들로 목록화하여 결과를 뽑아낸다.
-f :: fork로 생성된 자식프로세스의 시스템콜까지 추적한다.
-F :: vfork로 생성된 자식프로세스의 시스템콜까지 추적한다.
-p [pid] :: 프로세스를 지정하여 시스템콜을 추적한다.
-v :: 버젼, 환경, 상태 등을 포함하여 결과를 뽑아낸다.
-x :: ASCII 이 아닌 문자열을 16진수형태로 추가하여 결과를 출력한다.
-xx :: 모든 문자열을 16진수 형태로 출력

등등.. 이외엔 man page 참조.. 

참고문헌 : 유닉스 리눅스 프로그래밍

List of Articles
번호 제목 글쓴이 날짜 조회 수
347 SSL 패스워드 삭제 하기 ADMINPLAY 2014-04-27 5468
346 SCM - 캐시 서버 구축 (Squid in Linux) ADMINPLAY 2014-04-27 8337
345 CentOS Linux Remote Desktop 에서 로그인 화면보기 ADMINPLAY 2014-04-14 7910
344 CentOS 자동로그인 설정 ADMINPLAY 2014-04-14 8926
343 Linux Command 로 Mysql table drop 방법 ADMINPLAY 2014-04-07 5807
342 gcc Library 경로 지정 ADMINPLAY 2014-04-07 6104
341 CentOS 5.6 + NginX 0.8.54 + Django 1.3 (FastCGI) + Pyt... ADMINPLAY 2014-03-28 6256
340 CentOS 6.5 + Python2.7 + MySQL_Python-1.2.3 ADMINPLAY 2014-03-28 8037
339 python과 mysql 연동시 libmysqlclient_r.so.* 에러가 날 ... ADMINPLAY 2014-03-27 5623
338 python mysql connector 설치 및 SQLAachemy 연동 ADMINPLAY 2014-03-27 7964
337 SVN 클라이언트 명령어 ADMINPLAY 2014-03-18 7522
336 CentOS 6.X GUI 로그인 화면에서 로그인 했던 계정 리스트... ADMINPLAY 2014-03-05 16741
335 OS X 매버릭스가 NAS, 윈도우 PC 등 SMB 장비에 연결하지 ... ADMINPLAY 2014-03-04 6831
334 OS X 10.9 매버릭스의 기본 파일공유 프로토콜은 AFP가 아... ADMINPLAY 2014-03-04 11372
333 telnet 과 ssh 의 차이점 ADMINPLAY 2014-03-01 6540
332 vimrc 설정 file ADMINPLAY 2014-03-01 6174
331 Linux 마우스 휠 방향 바꾸기 (mac 처럼 마우스 휠 바꾸기) ADMINPLAY 2014-02-27 11937
330 디스크 UUID 변경후 하드부팅정보 수정하기 ADMINPLAY 2014-02-26 21085
329 linux daemon (리눅스 데몬 설명) ADMINPLAY 2014-02-26 649768
» Strace - 시스템콜과 신호 추적 file ADMINPLAY 2014-02-25 6106

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234