미니옵빠의 code stubs

truss, trace, strace 본문

OS/Linux

truss, trace, strace

미니옵빠 2011. 8. 28. 19:41
출처 바라미의 공간 | 바라미
원문 http://blog.naver.com/jesh1052/100037207958

디버깅의 시작은 과감히 툴을 먼저 배우는 것이라고 해도 과언이 아닐정도로 툴에
익숙해야합니다. 디버깅 툴은 어떻게 보면, 크게 구분이 되어 있는 것은 아니지만
사뭇 심도있는 분석을 위해서는 해킹에 사용되는 것과 크게 다르지 않습니다.
디버깅과 해킹은 같은 맥락에 있는 것이지요.

 

먼저 쉽고 재밌게 접근할 수 있는 것이 system call tracer입니다.

 

linux: strace
solaris: truss
hpux: trace(10.x), tusc(11.x) 로 알려져 있는 것들이지요.

위 프로그램들의 option 들이 대개 비슷합니다.

 

"strace ls" 만 해도 나오는 내용이 어떻다는 것을 보실 수 있을텐데요.
이들은 모두 kernel level의 함수들입니다. 즉 system call이라는 것이지요.

직관적으로 이용할 수 있는 방법은 다음과 같은 것들입니다.

 

1. 어떤 shared library가 사용되는지 알수 있음.
2. 1번과 비슷하지만 어떤 파일을 열다가 실패하는지,
    대개 configuration file을 global, home.. 순으로 찾지요.
3. process가 잠시 멈출때, 어떤것을 대기하고 있는지.
4. 전송되고 들어오는 내용은 무엇인지 (-s 1024 option)
5. 어떤 signal을 받는지.
6. ipc 객체들은 어떤것들이 이용되는지. 등등...

 

system call은 기본적으로 OS를 다루는 방법에 대한 것이므로, 많은 hint를 얻을 수 있습니다.

option 들중에 중요한 것 몇가지만 소개하자면, system call의 가장 대표적인 것중의
하나는 실행되고 있는 daemon의 현재 작업내용을 살펴볼수 있는 것이 있습니다.

strace -p

형태로 실행중인 process를 살펴보는 것이지요.

더불어 daemon의 경우 fork가 일어나는 경우가 많은데,

strace -f -p

-f option을 주어 fork되어 나오는 process까지 trace 하라는 것입니다.

fork외에 vfork도 추적할 수 있어야하므로 대개 f를 쓸때는 다음과 같이 사용합니다.

strace -fF -p

더 줄여서

strace -fFp

로 사용하지요.

 

tusc 사용 예 >>

tusc -r 10 -w 10 -b 1024 -e -n -p -T '' -f -v [pid]

 

이것들을 종합하여 다음과 같은 용도로 사용할 수 있습니다.

 

1. daemon 이 갑자기 멈추었는데, debug 용 printf를 집어 넣지 않았을 때, 알고싶은 경우.
2. socket server가 과연 process가 connection을 접수한 뒤 제대로 fork 되는지.
3. telnet 서버에 접속하였는데, prompt가 떨어지지 않는 경우 inetd가 무슨일을
   하는지. (대개 tcp_wrapper에 의해 DNS IP resolve 하는 경우가 많죠.)

 

지금까지 한 것은 일부분에 지나지 않습니다. 남의 program을 추적할때 system call
trace를 하는 것만으로 process가 하는 일을 상상할 수 있다면, 프로그램을
만든사람은 어느 code를 지나가고 있는지 알 수 있을 것입니다

출처 : Tong - 테크맨님의 테크맨님의 기본통통

==================================================================================

 

[hp] 시스템 콜 추적 프로그램 tusc
* tusc
  tusc is the tool to trace system calls on HP-UX.
  Because the system calls are defined within the kernel sources, they are identical for the
  whole operating system.
  That's why you don't need source code or debug information in a
  program to trace its system calls.
 
 - 솔라리스의 truss와 같은 기능을 하는 툴이라고 생각하면 됨.

* tusc 프로그램 있는 위치

* 실행방법
tusc.7.6.shar파일을 시스템으로 전송하여 다음과 같이 실행하면 tusc를 사용할 수 있음
(shar 파일은 소스코드들을 한 파일에 모아준 파일로 특별한 프로그램을 요구하지 않고
'sh sharfile'과 같은 명령을 하면 파일들이 풀립니다.)

# sh tusc.7.6.shar
위와 같이 하면 파일이 풀리면서 tusc 실행파일이 생성됨.
PATH에 tusc를 푼 디렉토리를 걸어주고 다음과 같이 실행하면 tusc를 사용가능.
 
* 사용법 : tusc [ options ] PID or 프로그램이름
(root)/opt/test (488) # tusc
Usage: tusc [-] -OR-
        -a: show exec arguments
        -A: append to output file
        -b bsize: dump 'bsize' max bytes (-r/-w)
        -c: count syscalls instead of printing trace
        -C: like -c but also print high/low/average stats
        -d [+][!][fd | all]: select only syscalls using fd
        -e: show environment variables
        -E: show syscall entries
        -f: follow forks
        -F: show kernel's ttrace feature level
        -g: don't attach to members of my session
        -h: show state of all processes when idle
        -i: don't display interruptible syscalls
        -I start[/stop]: single-step and show instructions
        -k: keep alive (wait for *all* processes)
        -l: print lwpids
        -L [!]lwps: [un]select these lwps
        -n: print process names
        -o [file|fd]: send trace output to file or fd
        -p: print pids
        -Q: be quiet about some warnings
        -r [!][fd | all]: dump read buffers
        -R: show syscall restarts
        -s [!]syscalls: [un]select these syscalls
        -S [!]signals: [un]select these signals
        -t: detach process if it becomes traced
        -T timestamp: print time stamps
        -u: print user thread IDs (pthreads)
        -v: verbose (some system calls only)
        -V: print version
        -w [!][fd | all]: dump write buffers
        -x: print raw (hex) arguments
        -X: print data in an exportable format
        -y: register verbosity (with -I)
        -z: only show failing syscalls

* 파일로 저장하기 위해서는 다음과 같이 하면 됩니다.
  # tusc PID | tee result.txt