Operating System/Solaris2007/07/21 19:37

4장. SunOS 4.x의 trace, Solaris의 truss기능

4.1 SunOS 4.x 에 대한 추적(Trace)기능

Program을 Tuning 또는 Debug 할 때는 어떠한 System Call을 사용하고 있는지, 또한 어떠한 Parameter를 교환하고 있는지 판단하면 도움이 된다. 그 정보들을 조사하기 위해서는 trace 명령을 통하여 Process Mask 내에 특별 Bit를 설정한다. 그렇게 하면 추적이 이루어지며 Kernel의 System Call Interface Routine에 의해서 보고되는 정보가 출력된다. 추적은 실행전체를 대상으로 하여 사용할 수도 있고, 실행중인 Process에 임의의 시점에서도 적용할 수 있다. 특별한 Compiler Option은 필요 없다.

Solaris 2에서 trace는 truss로 명칭이 변경되며 더욱 많은 기능을 갖추고 있다. 이하에서 나타내고 있는 것은 추적 출력에 의미를 정확히 하기 위한 설명을 붙인 것이다. 이 출력에는 cp가 mmap콜을 사용하는 방법과 공유 라이브러리를 개시하는 방법도 나타내고 있다.

<Trace 출력의 설명>

Trace 출력

설 명

% trace cp NewDocument Tunning

명령에 대하여 trace를 사용

open ("/user/lib/Id so",0,04000000021)=3

공유 Library Loader를 획득

read(3,"",32)=32

a.out header를 읽어 동적 링크 여부를 확인

mmap(0.40960,0x5,0x80000002,3, 0):0xf77e0000

Code를 Memory 내에 Mapping

mmap(Oxf77e8000, 8192, 0x7, 0x80000012, 3, 32768)=0xf77e8000

Data를 Memory 내에 Mapping

open("/dev/zero",O,07)4

O으로 재설정한 Page를 획득

getrlimit(3, Oxf7fff8bo)=O

제한정보 읽기

getrlimit(3, Oxf7fff8bo)=O

제한정보 읽기

mmap(Oxf7800000, 8192, 0x3, 0x80000012, 4, 0)=0xf7800000

/dev/zero를 bss?로 Mapping

close (3)=0

ID so를 Close

getuid ()=1434

사용자 ID획득

getgid ()=10

Group ID획득

open('/etc/IdsO.cache" , 0, 05000000021)-3

공유 Library Cache Open

fstat (3, Oxf7fff750)=0

Cache의 내용이 최신의 것인지 확인

mmap(0.4096,Oxl, 0x80000001, 3, 0)=Oxf77c000

Cache를 Mapping하여 읽기

close (3)=O

Cache 폐쇄

open ("/usr/openwin/lib", 0, 01010525)= 3

 

fstat(3, oxf7fff750)=0

LD LIBRARYPATH에 /usr/openwin/lib이 포함되어 있어 그것을 먼저 본다

mmap(Oxf7802O00,8192, 0x3, 0x80000012, 4, 0)=0xf7802000

 

getdents (3, Oxfi78000d8, 8192) 1488

올바른 버전의 라이브러리를 찾아서 Directory Entry를 몇 가지 획득

getdents (3, oxf78000ds, 8192)= O

 

close (3)=0

/usr/openwin/lib close

open ("/usr/lib/-ibe so 1 6", 0, 032724)= 3

공유 libc 획득

read (3,"".., 32)132

OK 확인

mmap (0, 458764, 0x5, 0x80000002, 3, 0_)= Oxf7730000

Memory 내에 Code Mapping

mmap(oxf779ca00,16384,0x7,0x80000012,3,442368)= Oxf779c000

Memory 내에 Data Mapping

close (3)=0

libc Close

close (4)=0

/dev/zero Close

open ("NewDocument", 0, 03)=3

드디어 입력 File Open

fatat(3, Oxf7fff970)= O

Size의 통계정보 검색

stat ("Tuning",Oxf7fff930)=-1 ENOENT(No such file or directory)

출력 File의 통계정보 검색

stat ("Tuning",1Oxf7fff930)=-1 ENOENT(No such file or directory)

출력 File 없음

creat("Tuning" O644)=4

출력 File 작성

mmap(O, 82, OX1, 0x80000001, 3, 0)= Oxf7710000

입력 File Mapping

mctl (oxf77100O0, 82, 4, Ox2)= O

순차 Access 통지

write(4,"This is a test file for my paper".., 82)=82

새로운 File로 입, 출력

mnmap(oxf7710000, 82)=O

입력 File의 Mapping Release

close (3)=O

입력 File Close

close (4)=0

출력 File Close

close (O)=O

stdin Close

close (1)=O

stdout Close

close (2)=O

stderr Close

exit (O)=?

Program 종료

4.2 Solaris 2.x 에 대한 추적 기능

truss 명령에는 trace에는 없는 편리한 기능이 매우 많다. 자() Processor를 추적하거나 System Call과 Signal 수(계산) 그리고 시간을 조사하는 기능이 있다. 또한 다른 Option 기능을 사용하면 지정한 System Call을 제외한 trace와 지정한 System Call만을 추적하거나 그리고 Data 구조를 완전히 Print 출력할 수도 있다.

이하의 표는 Data 구조용의 장황한 Mode를 설정하기 위해서 -v Option을 설정한 truss 명령의 출력 일부와 truss -c에서 System Call의 수 (계산)을 표시한 예이다.

# truss -v all cp NewDocument Tuning

execve("/bin/cp", 0xEFFFF598, 0xEFFFF5A8) argc = 3
open("/dev/zero", O_RDONLY) = 3
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xEF7F0000
open("/usr/lib/libintl.so.1", O_RDONLY) = 4
fstat(4, 0xEFFFF254) = 0
d=0x0080001E i=48439 m=0100755 l=1 u=2 g=2 sz=15720 at = Nov 7 15:31:06 KST 1997 [ 878884266 ]
mt = May 3 12:33:31 KST 1996 [ 831094411 ]
ct = Jul 3 14:29:10 KST 1997 [ 867907750 ]
bsz=8192 blks=32 fs=ufs

.....

# truss -c cp NewDocument Tuning

syscall        seconds    calls    errors

_exit        .00        1
read        .00        2
write        .00        1
open        .01        12    1
close        .00        11
creat        .00        1
brk        .00        2
stat        .00        5
lseek        .00        1
fstat        .00        7
access        .01        8    1
execve        .00        1
mmap        .01        20
munmap    .00        8
memcntl    .00        1
acl        .00        1
sys totals:    .03        82    2
usr time:    .03
elapsed:    .12

#cd /usr/openwin/bin
#cp openwin openwin.org
#vi openwin.org

truss -fo /tmp/outputfile -t exec /usr/openwin/bin/openwin.org"를 openwin.org 의 맨처음에 삽입

#chmod 755 openwin.org
#openwin.org --> 하면 openwin을 trace 하면서 내용은 /tmp/outputfile에 쌓인다.

Creative Commons License
Posted by BLUEDAY™