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에 쌓인다.
'Operating System > Solaris' 카테고리의 다른 글
| POWER ADMIN for SUN (Mail) (0) | 2007/07/26 |
|---|---|
| POWER ADMIN for SUN (Swap) (0) | 2007/07/25 |
| POWER ADMIN for SUN (NVRAM; OK_mod Command) (0) | 2007/07/24 |
| POWER ADMIN for SUN (CRON) (0) | 2007/07/23 |
| POWER ADMIN for SUN (Accounting & Permission) (0) | 2007/07/22 |
| POWER ADMIN for SUN (Solaris의 trace, truss 기능) (0) | 2007/07/21 |
| POWER ADMIN for SUN (Quota 설정) (0) | 2007/07/20 |
| POWER ADMIN for SUN (Command 사용법 및 기능 설명) (0) | 2007/07/19 |
| POWER ADMIN for SUN (SUN OS 및 SUN Product) (0) | 2007/07/18 |
| POWER ADMIN for SUN (Index) (0) | 2007/07/17 |
| System 성능 측정 (0) | 2007/07/16 |