##### strace

프로그램이 실행되는 동안 수행되는 시스템콜을 추적하는 도구

디버깅 초기에 문제를 확인하거나 메모리 문제 같은 운영체제 관련 문제를 추적할 때 사용


$ strace -help

usage: strace [-CdffhiqrtttTvVxxy] [-I n] [-e expr]...

              [-a column] [-o file] [-s strsize] [-P path]...

              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

   or: strace -c[df] [-I n] [-e expr]... [-O overhead] [-S sortby]

              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]


-f : 자식프로세스도 추적

-tt / -T : 타임 스탬프 표시 / 실지 함수호출 시간 표시

-v : 상세 출력 모드

-p PID : 이미 실행중인 프로세스 추적

-o 파일명 : 추적 결과 파일에 저장

-e trace=### : ###에 해당되는 내용 출력

ex) -e trace=open



$ strace /bin/pwd

시스템콜 이름, 매개변수, 반환값





$ sudo strace -p $(pgrep ssh)        // ssh 포트그룹을 식별하여 ssh 프로세스의 시스템 콜 확인


> select 함수에서 waiting


> 다른 곳에서 ssh를 통해 접속


> accept 함수로 떨어지면서 정상정으로 ssh 접속 수행




$ sudo strace -e trace=process -p $(pgrep ssh)      // ssh 동작 중 프로세스 관련 시스템 콜 부분만 뽑아 보기


> 프로세스가 수행되는 중인 정보만 나옴


> ssh 접속


> clone 시스템 콜이 동작하여 프로세스가 생성됨


> $ exit 명령을 사용하여 ssh 접속 종료


> ssh 접속 종료후의 프로세스 관련 내용 출력





##### ltrace 

프로그램이 실행되는 동안 호출되는 동적(공유) 라이브러리 함수를 추적하는 도구

strace와 유사

동적 라이브러리만 추적하므로 파악하기는 쉽지만, 문제의 원인을 찾기가 어려움


-u username : username의 권한으로 명령 실행하면서 라이브러리 추적 (관리자 권한 필요)

-tt / -T : 타임 스탬프 표시 / 실지 함수호출 시간 표시

-v : 상세 출력 모드

-p PID : 이미 실행중인 프로세스 추적

-o 파일명 : 추적 결과 파일에 저장

-e {[+|-][라이브러리 함수명][라이브러리 파일명]} : 해당 내용만 출력



$ ltrace cat /etc/passwd


> 함수들과 인수들의 값을 동적으로 확인



$ sudo ltrace -e malloc+free+select -p $(pgrep ssh)        // ssh 동작 중 -e 옵션으로 malloc+free+select 부분만 출력



> ssh 접속이 되면 해당 부분만 출력


> ssh 접속 종료에도 해당 정보만 출력



 

'System > Linux OS ' 카테고리의 다른 글

리눅스 환경변수와 UID, PID, 시스템자원의 제한  (0) 2015.12.24
lsof  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23


##### gcc 

: GNU Compiler CollectionGNU의 C 컴파일러

(이름이 바뀜, 이전엔 C Compiler 였나..?)


ANSI + POSIX



### 과정 및 옵션

.c -> 컴파일(전처리①, 문법검사/코드최적화 -> .o -> 링크 -> .exe


① 컴파일과정 - 전처리 옵션

-I : 헤더파일 위치지정 옵션, 표준 디렉토리(/usr/include) 외의 헤더파일의 위치 지정에 사용

-D : Dname, name에 지정된 심볼을 1로 정의, 조건부 컴파일에서 유용하게 사용 됨


② 컴파일과정 - 문법검사/코드최적화

-O : "ON", 컴파일러 최적화 옵션으로 최적화 단계(0~3)를 N으로 지정


③ 링크과정

-L : 라이브러리 파일이 위치하는 경로를 지정

-l + string : 컴파일 시 string으로 입력한 경로의 라이브러리 파일을 추가

* 라이브러리 파일은 ".so" or ".a"

* 라이브러리 파일의 이름은 "lib"로 시작

* 표준 라이브러리는 "/usr/lib"에 존재

ex) 수학 표준 라이브러리 libm.a or libm.so 사용시 "-lm"을 사용해야 함

gcc -o exam_mlib ex exam_mlib.c -lm


④ 기타

g : 실행파일에 표준 디버깅 정보 포함, gdb, DDD 등 디버거 이용 시 사용

wall : gcc가 제공하는 모든 경고를 사용,

시스템과 네트워크 프로그램 및 커널기반의 프로그램 작성 시 해당 옵션을 사용하는 게 좋음



### 라이브러리


1. 정적 라이브러리

소스파일 생성(.c) -> 오브젝트파일 생성(.o) -> 라이브러리파일생성(.a)

  vi static.c                gcc -c static.c                ar rb lib##.a  static.o


2. 동적 라이브러리

소스파일 생성(.c) -> 재배치 가능한 오브젝트파일 생성(.o) -> 라이브러리파일생성(.a)

  vi shared.c              gcc -c -fPIC shared.c                        ld -shared -o lib##.so shared.o


* 공유 라이브러리 파일 이용 시 메모리에 미리 올라가져 있어야 사용할 수 있으며, 환경변수 설정 후 사용할 수 있게 됨됨

사용자 home의 .bashrc파일에 저장하여 매번 실행해야하는 불편함을 줄일 수 있음




### sysinfo를 활용하여 간단한 프로그램 작성


$ man 2 sysinfo


$ vi test_sysinfo.c


$ gcc -o sysinfo sysinfo.c


$ ./sysinfo



##### gdb 


* gdb를 이용하여 파일을 디버깅하려면 실행파일이 디버그모드로 컴파일 되어 있어야 함 (-g 옵션 사용)


명령어 참고. 

https://sourceware.org/gdb/current/onlinedocs/gdb/index.html#Top

http://egloos.zum.com/psyoblade/v/2653919




'System > Linux OS ' 카테고리의 다른 글

lsof  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
man  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23
Linux LVM  (0) 2015.08.12


### man 

: 개발자를 위한 리눅스 매뉴얼



man [section #no] 라이브러리 함수명 or 시스템 콜이름


section #no. 1 : 시스템 콜 매뉴얼

     2 : 라이브러리 함수 매뉴얼





$ man --help

Usage: man [OPTION...] [SECTION] PAGE...




### time system call 매뉴얼


$ man 2 time





SYNOPSIS : 문법

DESCRIPTION : 설명

RETURN VALUE




### memset() 함수 매뉴얼


$ man 3 memset





'System > Linux OS ' 카테고리의 다른 글

strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
리눅스 커널 커밋(commit)하기 - ing  (0) 2015.12.23
Linux LVM  (0) 2015.08.12
[Linux] 리눅스 모니터링  (0) 2015.04.22

+ Recent posts