truss 사용 예제
프로세스 id 4083828 에 대한 truss 사용 예제 이다.
-w : 소켓으로 write 한 거
-r : 소켓에서 읽은 거
-o : 출력파일 지정
-p : truss 할 프로세스 번호
$ uname -a
AIX dev04 3 5 000955634C00 --> aix version 5
$ truss -w all -r all -o aa.txt -p 4083828
thread_tsleep(0, 0xF048F554, 0x00000000, 0x35EE8E38) = 4
= 0x00000000
thread_setmystate_fast(0x4000000C, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x10540043, 0x10540043, 0x78E4CED8) = 7
= 0x00000000
thread_terminate_unlock(0xF048EBE8) = 26
send(105, 0x30A36B68, 7, 0) = 0
= 0
= 7
send(105, 0x30A36B68, 17, 0) = 17
thread_twakeup(2855019, 1073741824) = 0
= 0
= 1073741824
kread(105, 0x30A268A8, 4) = 0
= 4
kwrite(1, 0x30132AA8, 37) = 4
kwrite(1, 0x30132AA8, 37) = 37
S t r e a m H a n d l e r T h r e a d f o r S T D O U T
e x i t s
kwrite(1, 0x30132AA8, 1) = 8
kwrite(1, 0x30132AA8, 1) = 1
\n
kthread_ctl(2, 0x00000000) = 26
= 0
thread_setmystate_fast(0x4000000C, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x00002400, 0x00000000, 0x78E4CED8) = 7
= 0x00000000
thread_setmystate_fast(0x4000000C, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x106B80ED, 0x106B80ED, 0x78E4CED8) = 68
= 0x00000000
mprotect(0x37DC8000, 4096, 3) = 4
= 0
thread_terminate_unlock(0xF048EBE8) = 4
send(105, 0x30A36B68, 8, 0) = 8
send(105, 0x30A36B68, 26, 0) = 26
send(105, 0x30A36B68, 7, 0) = 7
send(105, 0x30A36B68, 2, 0) = 2
send(105, 0x30A268A8, 4, 0) = 4
send(105, 0x30A268A8, 4, 0) = 4
send(105, 0x30A36B68, 8, 0) = 8
send(105, 0x30A36B68, 26, 0) = 26
send(105, 0x30A36B68, 7, 0) = 7
send(105, 0x30A36B68, 2, 0) = 2
send(105, 0x30A268A8, 4, 0) = 4
send(105, 0x30A268A8, 4, 0) = 4
send(105, 0x30A36B68, 8, 0) = 8
send(105, 0x30A36B68, 26, 0) = 26
send(105, 0x30A36B68, 7, 0) = 7
send(105, 0x30A36B68, 9, 0) = 9
kread(318, 0x30672528, 8192) = 0
kwrite(1, 0x30132AA8, 37) = 37
S t r e a m H a n d l e r T h r e a d f o r S T D E R R
e x i t s
kwrite(1, 0x30132AA8, 1) = 1
\n
kthread_ctl(2, 0x00000000) = 0
thread_setmystate_fast(0x4000000C, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x00001AE6, 0x00000000, 0x78E4CED8) = 0x00000000
thread_setmystate_fast(0x4000000C, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x102B906B, 0x102B906B, 0x78E4CED8) = 0x00000000
mprotect(0x380E1000, 4096, 3) = 0
thread_terminate_unlock(0xF048EBE8) = 0
thread_tsleep(0, 0xF048F574, 0x00000000, 0x360FAE38) = 0
thread_tsleep(0, 0xF048F584, 0x00000000, 0x36202E38) = 0
thread_tsleep(0, 0xF048F54C, 0x00000000, 0x35E64E38) = 0
thread_tsleep(0, 0xF048F5BC, 0x00000000, 0x365A8E38) = 0
= 0
= 0
thread_tsleep(0, 0xF048F564, 0x00000000, 0x35FF1E38) = 0
= 0
thread_tsleep(0, 0xF048F5AC, 0x00000000, 0x36499E38) = 0
thread_tsleep(0, 0xF048F5B4, 0x00000000, 0x36521E38) = 0
아래 글은 관련 글로서 퍼온 겁니다.
2005/11/11 21:35
원문글 : http://blog.naver.com/ysbahk/60019365742
디버깅의 시작은 과감히 툴을 먼저 배우는 것이라고 해도 과언이 아닐 정도로 툴에 익숙해야합니다. 디버깅 툴은 어떻게 보면, 크게 구분이 되어 있는 것은 아니지만 사뭇 심도있는 분석을 위해서는 해킹에 사용되는 것과 크게 다르지 않습니다.
디버깅과 해킹은 같은 맥락에 있는 것이지요.
먼저 쉽고 재밌게 접근할 수 있는 것이 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 <pid>
형태로 실행 중인 process를 살펴보는 것이지요.
더불어 daemon의 경우 fork가 일어나는 경우가 많은데,
strace -f -p <pid>
-f option을 주어 fork되어 나오는 process까지 trace 하라는 것입니다.
fork 외에 vfork도 추적할 수 있어야 하므로 대개 f를 쓸때는 다음과 같이 사용합니다.
strace -fF -p <pid>
더 줄여서
strace -fFp <pid>
로 사용하지요.
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를 지나가고 있는지 알 수 있을 것입니다
Truss에 대한 OS별 간략한 사용법이다.
통상 System call분석에 많이 사용되고 있다.
1. HP-UX
$ tusc -afpo <output file> <pid> <executable>
2. AIX
$ truss -aefo <output file> <executable>
3. SunOS
$ truss -aefo <output file> <executable>
예) truss -o truss.txt -p (process pid), truss -p (process id)
4. LINUX
$ strace -fo <output file> <executable>
■ Example on HP-UX
( Attached to process 28745 ("tmm -b 28744 -n tmaxh4") [64-bit] )
[28745] select(10, 0x800000010000afa8, 0x800000010000bd98, NULL, 0x800003ffbfff17c0) [sleeping]
[28745] time(0x8000000100008ee0) .................................... = 1163526259
[28745] write(1, "( D 1 ) T M M s e l e c t ".., 20) .......... = 20
[28745] write(1, "( D 1 ) T M M n o d e a l ".., 26) .......... = 26
[28745] write(1, "( D 1 ) T M M n o d e [ 0 ] ".., 36) .......... = 36
[28745] write(1, "( D 1 ) T M M n o d e [ 1 ] ".., 36) .......... = 36
[28745] write(1, "( D 1 ) T M M c h e c k p ".., 23) .......... = 23
[28745] socket(AF_INET, SOCK_STREAM, 0) ............................. = 10
[28745] fcntl(10, F_GETFL, 0) ....................................... = 2
[28745] fcntl(10, F_SETFL, 65538) ................................... = 0
[28745] connect(10, 0x800003ffbfff1a08, 16) ......................... ERR#245 EINPROGRESS
'컴퓨터활용 > 유닉스' 카테고리의 다른 글
C 로 구현한 right trim function (1) | 2008.06.16 |
---|---|
gcc 이야기 (0) | 2008.05.19 |
find 명령어 옵션 (2) | 2008.05.12 |
쉘에서 문자열 조작하기 (0) | 2008.02.28 |
VI 에디터 120% 사용하기 (0) | 2007.12.18 |