jsyserr

   jsyserr

  사용법


	jsyserr -a [-e errno] [-t second][-o output][-S][-X]
	jsyserr -n execname [-e errno] [-t second][-o output][-S][-X]
	jsyserr -p pid [-e errno] [-t second][-o output][-S][-X]
	jsyserr -F syscall[,...] { -a | -n execname | -a pid } [-e errno] [-t second][-o output][-S][-X][-A][-0]
	jsyserr -P syscall[,...] { -a | -n execname | -a pid } [-e errno] [-t second][-o output][-S][-X]
	jsyserr -T syscall[,...] { -a | -n execname | -a pid } [-e errno] [-t second][-o output][-S][-X][-A][-0]
	jsyserr -V

	Options are as follows:

	-?                print this help
	-0                show time information
	-A                print process name and arguments instead of execname with -F or -T option
	-a                examine system call errors for all processes
	-e errno          filter by errno
	-F syscall[,...]  print system call directly
	-n execname       examine system call errors for the 'execname'
	-o output         specify output file
	-P syscall[,...]  examine the number of system calls for the specified system call
	-p pid            examine system call errors for the 'pid'
	-S                print only dtrace script
	-t second         examine system calls during the second
	-V                show version
	-T syscall[,...]  print user stack trace directly
	-X                except system call error of 'dtrace' commands
  설명

jsyserr 명령어는 Solars 10 버전에서 제공하는 dtrace 명령어를 이용하여, 오류가 발생한 시스템 콜에 대한 errno 번호 별로 발생한 횟수를 출력한다.

다음은 jsyserr 명령어의 사용 예제이다.

# /opt/JSparm/bin/jsyserr -a -t 5
Tracing... for 5 seconds
:: For all processes
:: For system call: ALL
:: Date: 2011 Sep 23 20:09:19
:: Elapsed: 5.001
                 SYSCALL ERRNO   COUNT DESC
                   ioctl     2     510 ENOENT - No such file or directory
                p_online    22     255 EINVAL - Invalid argument
                    read    11       4 EAGAIN - Resource temporarily unavailable
                 pollsys     4       4 EINTR - interrupted system call
                lwp_park    62       1 ETIME - timer expired
           lwp_cond_wait    62       1 ETIME - timer expired
                   ioctl    22       1 EINVAL - Invalid argument
                   TOTAL     -     776

위의 명령어에서 -a 옵션은 모든 프로세스의 시스템 콜을 조사하라는 의미이고, -t 옵션을 사용하여 데이타를 수집하는 시간을 5초로 지정하였다.

jsyserr 명령어의 출력의 의미는 다음과 같다.

:: For all processes
모든 프로세스에 대하여 조사를 하였다는 의미이다.
:: For all system: ALL
모든 시스템 콜에 대하여 조사를 하였다는 의미이다.
:: Date: 2011 Sep 23 20:09:19
데이타를 수집한 날짜를 보여준다.
:: Elapsed: 5.001
데이타를 수집하는데 소요된 시간을 1/1000초 까지 보여준다.
컬럼 설명
SYSCALL 시스템 콜 이름
ERRNO 시스템 콜에서 발생한 오류번호 (errno)

COUNT 해당 오류를 발생한 시스템 콜의 횟수
DESC ERRNO 컬럼에 있는 번호에 대한 설명

다음은 -p 옵션을 사용하여 PID 607 번 프로세스의 시스템 콜의 오류 정보를 5 초 동안 수집한 예제이다.

# jsyserr -p 607 -t 5
Tracing... for 5 seconds
:: For pid = 607
:: For system call: ALL
:: Date: 2011 Sep 23 20:46:36
:: Elapsed: 5.001
                 SYSCALL ERRNO   COUNT DESC
                    read    11      10 EAGAIN - Resource temporarily unavailable
                 pollsys     4      10 EINTR - interrupted system call
                   TOTAL     -      20

실행 도중에 'CTRL-C' 키를 타이핑하면, 그 때까지의 정보를 출력한다.

jsyserr 명령어는 dtrace 명령어를 실행하여, 그 결과물을 받아서 사용자가 보기 쉽게 가공하여 보여준다.
-S 옵션을 지정하면, dtrace 명령어를 실행할 때 사용되는 script의 내용을 보여준다.

# jsyserr -a -t 5 -S
#!/usr/sbin/dtrace -s
#

#pragma D option quiet

dtrace:::BEGIN
{
        self->begin = timestamp;
        printf( "Tracing... for 5 seconds\n" );
        printf( ":: For all processes\n" );
        printf( ":: For system call: ALL\n" );
}

syscall:::return
/errno != 0/
{
        @V_calls[probefunc,errno] = count();
}

tick-5sec
{
        exit(0);
}

dtrace:::END
{
        self->elapsed = timestamp - self->begin;
        printf( ":: Date: %Y\n", walltimestamp );
        printf( ":: Elapsed: %d\n", self->elapsed );
        printf( "\n" );
        printf( ":: Errno counts:\n%16s %5s %7s\n", "SYSCALL", "ERRNO", "COUNT" );
        printa( "%16s %5d %@7d\n", @V_calls );
        printf( "\n" );
}

다음은 jsyserr 명령어의 옵션이다.

옵션설명
-0 -0 옵션을 지정하면, -P 옵션과 -T 옵션을 사용할 때 시간정보를 출력한다.
-A -A 옵션을 지정하면, -P 옵션과 -T 옵션을 사용할 때 프로세스명과 인수도 함께 출력한다.
-a -a 옵션을 지정하면, 모든 프로세스의 시스템 콜의 오류 정보를 조사한다.
-e errno -e 옵션에 오류 번호를 지정하면, 지정한 오류 번호에 대해서만 조사한다.

다음은 모든 프로세스의 모든 시스템 콜에 대하여 오류 번호가 11 번인 것을 3 초 동안 조사한다.

# jsyserr -F all -a -e 11 -t3
Tracing... for 3 seconds
:: For all processes
:: For system call: ALL
  PID   UID                  SYSCALL ERRNO COMMAND
  765     0                     read    11 Xorg
  765     0                     read    11 Xorg
  765     0                     read    11 Xorg
  765     0                     read    11 Xorg
  765     0                     read    11 Xorg
  765     0                     read    11 Xorg

-F syscall[,...] -F syscall 옵션을 사용하면, 지정한 시스템 콜에서 오류가 발생한 것을 실시간으로 보낸다.

# jsyserr -F pollsys -a -0
Tracing... Hit <Ctrl-C> to end
:: For all processes
:: For system call: 'pollsys'
.......WALLTIMESTAMP   PID   UID                  SYSCALL ERRNO COMMAND
2012 Jan 17 15:30:32   775     0                  pollsys     4 Xorg
2012 Jan 17 15:30:32   775     0                  pollsys     4 Xorg
2012 Jan 17 15:30:33   775     0                  pollsys     4 Xorg
2012 Jan 17 15:30:33   775     0                  pollsys     4 Xorg
2012 Jan 17 15:30:34   775     0                  pollsys     4 Xorg
2012 Jan 17 15:30:34   775     0                  pollsys     4 Xorg
... skip ...

여러 개의 시스템 콜을 지정하려면, 콤마로 분리하여 여러 개를 지정할 수 있다.
시스템 콜 이름에 'all' 이라고 지정하면, 모든 시스템 콜 오류에 대하여 출력한다.

-0 옵션을 지정하면 위와 같이 시스템 콜을 호출한 시간 정보가 출력된다.

-n execname -n execname 옵션을 지정하면, 지정한 명령어의 이름을 가진 프로세스의 시스템 콜의 오류 정보만 조사한다
-o output -o output 옵션을 지정하면, jsyserr 명령어의 출력을 표준출력으로 보내지 않고, 파일로 파일로 저장한다.
-P syscall[,...] -P syscall[,...] 옵션을 사용하면, 지정한 시스템 콜에서 발생한 오류에 대해서 다음과 같이 호출한 명령어 이름과 PID와 시스템 콜과 오류번호와 횟수를 보여준다.

# jsyserr -P ioctl,pollsys -a -t 5
Tracing... for 5 seconds
:: For all processes
:: For system call: 'ioctl,pollsys'
:: Date: 2011 Sep 23 21:01:09
:: Elapsed: 5.001
         COMMAND   PID                  SYSCALL ERRNO   COUNT DESC
          dtrace  1895                    ioctl     2    1275 ENOENT - No such file or directory
            Xorg   607                  pollsys     4      10 EINTR - interrupted system call
          dtrace  1895                    ioctl    22       1 EINVAL - Invalid argument
           TOTAL     -                        -     -    1286

시스템 콜 이름에 'all' 이라고 지정하면, 모든 시스템 콜의 오류에 대해 조사한다.

-p pid -p pid 옵션을 지정하면, 지정한 PID의 프로세스의 시스템 콜의 오류 정보만 수집한다.
-S -S 옵션을 지정하면, dtrace 명령어가 실행할 dtrace script를 보여준다.
-T syscall[,...] -T syscall 옵션을 사용하면, 지정한 시스템 콜에서 오류가 발생한 시스템 콜에 대한 사용자 프로세스의 stack trace를 실시간으로 출력한다.

# jsyserr -T pollsys -a -0
Tracing... Hit <Ctrl-C> to end
:: For all processes
:: For system call: 'pollsys'

2012 Jan 17 15:32:34 pid=775 uid=0 syscall=pollsys err=4 execname=Xorg
              libc.so.1`__pollsys+0x15
              libc.so.1`pselect+0x18e
              libc.so.1`select+0x82
              Xorg`WaitForSomething+0x891
              Xorg`Dispatch+0x242
              Xorg`main+0x491
              Xorg`_start+0x80

2012 Jan 17 15:32:34 pid=775 uid=0 syscall=pollsys err=4 execname=Xorg
              libc.so.1`__pollsys+0x15
              libc.so.1`pselect+0x18e
              libc.so.1`select+0x82
              Xorg`WaitForSomething+0x891
              Xorg`Dispatch+0x242
              Xorg`main+0x491
              Xorg`_start+0x80
... skip ...

여러 개의 시스템 콜을 지정하려면, 콤마로 분리하여 여러 개를 지정할 수 있다.
시스템 콜 이름에 'all' 이라고 지정하면, 모든 시스템 콜 오류에 대하여 출력한다.

-0 옵션을 지정하면 위와 같이 시스템 콜을 호출한 시간 정보가 출력된다.

-t second -t second 옵션을 사용하여, 몇초 동안 시스템 콜을 조사할지 지정한다.
-t 옵션을 지정하지 않으면, Ctrl-C를 타이핑 타이핑할 때까지 계속 모니터링한다.
-V -V 옵션을 지정하면, 명령어의 버전 정보를 보여준다.
-X -X 옵션을 지정하면 "dtrace" 이름을 가진 프로세스의 system call은 처리하지 않는다.