5. Study/__나. UNIX

Error 문제

행복 금융 2008. 8. 21.

telnet

1. 문제 개요
   remote system으로 telnet 접속을 시도하였을 때 remote system에서 telnet request를
   거부하는 경우 "telnet: Unable to connect to remote host: Connection refused"
   와 같은 에러가 발생한다.
2. 문제 원인 및 해결방법
   telnet request를 받으면 "inetd" daemon에 의해서 in.telnetd가 수행되고 telnet
   서비스를 요청해온 시스템에 login prompt를 띄워준다.
   따라서 위와 같은 에러 메세지가 발생하면 telnet request를 받은 remote system에
   서 아래와 같은 사항들을 점검한다.
   2.1 "inetd" daemon이 실행 중인지 확인한다.
    # ps -ef|grep inetd
    inetd daemon이 실행 중이 아니면 아래와 같이 inetd daemon을 실행한다.
       # /usr/sbin/inetd -s
   2.2 /etc/inetd.conf 화일에 "telnet" 에 관해서 아래와 같이 정의되어 있는지 확
       인 한다.
       # grep telnet /etc/inetd.conf
       telnet  stream  tcp     nowait  root    /usr/sbin/in.telnetd    in.telnetd
       위와 같이 정의가 되어 있지 않으면, 위의 내용을 추가한 후 "inetd" daemon을
       re-start 시킨다.
          # ps -ef|grep inetd
              root   162     1  0  11월 28 ?        0:01 /usr/sbin/inetd -s
                     ^^^^
                     "inetd"의 process  번호
# kill -HUP 162

 

 

su
1. 문제 개요
   일반 사용자가 root 또는 다른 사용자로 su 명령을 실행했을 때, su 명령과 관련
   한 몇가지 화일의 owner나 permission에 의하여 "su: setuid: not owner"와 같은
   에러가 발생할 수 있다
2. 문제 원인 및 해결방법
   아래와 같은 3가지 항목을 점검한다.
   2.1 /usr/bin/su  명령의 owner가 root인지 확인 한다.
    # ls -l /usr/bin/su
    -r-sr-xr-x   1 root     sys        18360 1998년  1월 16일 /usr/bin/su*        
   2.2 /usr/bin/su  명령의 모드가 suid bit set을 가지고 있는지 확인한다.
    # ls -l /usr/bin/su
    -r-sr-xr-x   1 root     sys        18360 1998년  1월 16일 /usr/bin/su*
   2.3 /usr/bin 디렉토리가 포함된 file system이 mount 될때 nosetuid option이
      지정되어 있는지 확인한다.
        # mount
        / on /dev/dsk/c0t0d0s0 read/write/setuid/largefiles on 토 11월 28 09:24:08 1998
                                          ^^^^^^
        /proc on /proc read/write/setuid on 토 11월 28 09:24:08 1998
        /dev/fd on fd read/write/setuid on 토 11월 28 09:24:08 1998
위와 같이 "setuid" 라고 나오면 "nosetuid" option이 지정되지 않은 것이다.

 

 

su
1. 문제 개요
   일반 사용자가 다른 사용자로 su 명령을 실행 했을 때 su명령의 permission이
   잘못지정된 경우 "su:unknown id:user"와 같은 에러가 발생할 수 있다.
2. 문제 원인 및 해결방법
   /bin/su 명령의 permossion중 setuid bit가 지정되지 않은 경우에 이와 같은 에러
   가 발생하므로 /bin/su 명령의 permission 을 아래와 같도록 변경한다.
    # ls -l /bin/su
    -r-sr-xr-x   1 root     sys        15832 1997년  9월 11일 /bin/su
    # chmod 4755 /bin/su

 

 

could not grant slave pty
1. 문제 개요
   remote 시스템에서 telnet, rlogin, rsh 명령을 실행 하거나 x-term을 실행했을 때   관련되 화일의 permission이 잘못되었거나, 사용가능한 pseudo terminal부족으로
   "could not grant slave pty"와 같은 에러가 발생할 수 있다.
2. 문제 원인 및 해결방법
   2.1 /usr/lib/pt_chmod 화일의 permission이 잘못 설정된 경우 위와 같은 에러가
       발생한다. /usr/lib/pt_chmod 화일의 owner는 root 이어야 하며, permission
       은 아래의 결과와 같이 "4111"이어야 한다.
         # ls -l /usr/lib/pt_chmod
         ---s--x--x   1 root     bin         3120 1996년  5월  3일 /usr/lib/pt_chmod
    2.2 /usr/lib/pt_chmod 화일의 permission 과 owner가 정확하게 설정되어 있는 경
        우에 위의 에러가 발생하면 이는 사용 가능한 pseudo terminal(ptys)이 없기
        때문이다. 시스템에 defualt로 지정된 pseudo terminal의 갯수는 48개 이며,
        이 사용이 한도에 달하면 /etc/system 화일을 수정하여 갯수를 늘려주어야
        한다. 
        시스템에서 사용가능한 pseudo terminal의 갯수를 늘리는 방법에 관한 자세한
        내용은 기술문서  10007 을 참조한다.

 

 

error rcmd
1. 문제 개요
   remote system의 root로 rlogin을 하여 접속을 시도할때 관련된 화일의 permission
   이 잘못된 경우 "error rcmd: socket permission denied"와 같은 에러가 발생할 수 있다.
2. 문제 원인 및 해결방법
   2.1 /bin/rlogin 명령의 owner가 root이고 permission이 "4555" 인지를 확인한다.
       # ls -l /bin/rlogin
       -r-sr-xr-x   1 root     bin        15808 1997년  7월 16일 /bin/rlogin
       위의 결과와 같지 않으면 아래와 같이 변경한다.
       # chown root /bin/rlogin
       # chmod 4555 /bin/rlogin

 

 

Connection closed by foreign host
1. 문제 개요
   remote system으로 telnet/rlogin 접속을 시도하였을 때 관련된 화일의 owner및
   permission 잘못으로 "Connection closed by foreign host"와 같은 에러가 발생할 수 있다.
2. 문제 원인 및 해결방법
   /usr/bin/login 화일의 owner가 root인지 확인한다.
   # ls -l /usr/bin/login
   -r-sr-xr-x   1 root     bin        29512  9월 10일  08:54 /usr/bin/login
   owner가 root로 되어 있지 않으면 chown 명령으로 아래와 같이 변경한다.
   # chown root /usr/bin/login

 

 

ld.so.1
1. 문제 개요
   화일의 permission 문제 때문에 일반 사용자가 시스템에 login 할 때 아래와 같이
   "ld.so.1: fatal /dev/zero can't open file errno=13" 에러가 발생할 수 있다.
2. 문제 원인 및 해결방법
   아래의 각 화일 또는 directory들의 permission이 아래의 결과와 맞는지 확인한다.
   % ls -ald /dev
   drwxrwxr-x  16 root     sys      /dev
   % ls -ald /dev/zero
   lrwxrwxrwx   1 root     root     /dev/zero ->

../devices/pseudo/mm@0:zero

  % ls -ald /devices/pseudo
   drwxrwxr-x   2 root     sys      /devices
   % ls -ald /devices/pseudo
   drwxr-xr-x   2 root     sys      /devices/pseudo
   % ls -al

/devices/pseudo/mm@0:zero

   crw-rw-rw-   1 root     sys     

/devices/pseudo/mm@0:zero

installpatch and backoutpatch exit error codes
Patch를 install 하거나 backout 할때 발생되는 error code에 대한 설명은 아래와
같다.
1. INSTALLPATCH ERROR CODES:
   Exit Codes:
       0       No error
       1       Usage error
       2       Attempt to apply a patch that's already been applied
       3       Effective UID is not root
       4       Attempt to save original files failed
       5       pkgadd failed
       6       Patch is obsoleted
       7       Invalid package directory
       8       Attempting to patch a package that is not installed
       9       Cannot access /usr/sbin/pkgadd (client problem)
       10      Package validation errors
       11      Error adding patch to root template
       12      Patch script terminated due to signal
       13      Symbolic link included in patch
       14      NOT USED
       15      The prepatch script had a return code other than 0.
       16      The postpatch script had a return code other than 0.
       17      Mismatch of the -d option between a previous patch
               install and the current one.
       18      Not enough space in the file systems that are targets
               of the patch.
       19      $SOFTINFO/INST_RELEASE file not found
       20      A direct instance patch was required but not found
       21      The required patches have not been installed on the manager
       22      A progressive instance patch was required but not found
       23      A restricted patch is already applied to the package
       24      An incompatible patch is applied
       25      A required patch is not applied
       26      The user specified backout data can't be found
       27      The relative directory supplied can't be found
       28      A pkginfo file is corrupt or missing
       29      Bad patch ID format
       30      Dryrun failure(s)
       31      Path given for -C option is invalid
       32      Must be running Solaris 2.6 or greater
       33      Bad formatted patch file or patch file not found
       34      The appropriate kernel jumbo patch needs to be installed
2. BACKOUT PATCH ERRORS CODES:
   Exit Codes:
       0       No error
       1       Usage error
       2       Attempt to backout a patch that hasn't been applied
       3       Effective UID is not root
       4       No saved files to restore
       5       pkgrm failed
       6       Attempt to back out an obsoleted patch
       7       Attempt to restore CPIO archived files failed
       8       Invalid patch id format
       9       Prebackout script failed
       10      Postbackout script failed
       11      Suspended due to administrative defaults
       12      Backoutpatch could not locate the backout data
       13      The relative directory supplied can't be found
       14      Installpatch has been interrupted, re-invoke installpatch
       15      This patch is required by a patch already installed, can't back it out

 

 

Unable to open /dev/ptmx
1. 문제 개요
   remote 시스템으로 login(telnet, rlogin)을 할 때 remote 시스템에 사용가능한
   pseudo terminal(pty)이 없는 경우 "Unable to open /dev/ptmx: no such device"
   와 같은 에러가 발생한다.
2. 문제 원인 및 해결방법
   위의 문제가 발생하면 login을 할 시스템에 pseudo terminal(pty)의 갯수를 늘려
   준다. pseudo terminal의 갯수를 늘리는 방법에 대한 자세한 내용은 기술문서
    10007 을 참조한다.

 

 

Xlib
1. 문제 개요
   remote 시스템의 console로 명령의 실행 결과나 window를 DISPLAY를 하고자 할
   경우 아래와 같이 에러 메세지가 나타난다.
   Xlib: connection to ":0.0" refused by server
 Xlib: Client is not authorized to connect to Server
 Error: Can't open display: :0.0
2. 문제 원인 및 해결방법
   위의 에러가 발생하면 remote 시스템의 console 상에 login한 후 아래의 명령을
   실행하여 local 시스템이 remote 시스템의 access control list에 포함 되도록
   한다.
    % xhost "local-system-hostname"
    예) local 시스템의 hostname이 "cat"이라면 아래와 같이 지정한다.
     % xhost cat
     cat being added to access control list
   특정한 호스트 외에 다른 모든 시스템을 access control list 에 추가하려면 아래
   와 같이 지정한다.
    % xhost +
    access control disabled, clients can connect from any host

 

 

le0
1. 문제 개요
   시스템이 부팅하는 과정중 NVRAM에서 Link Integrity Test를 하는경우
   "le0: no carrier - twisted pair cable problem or disable hub link test?"
   와 같은 에러가 발생한다.
 
2. 문제 원인 및 해결방법
   이 에러를 없애기 위해서는 PROM mode에서 tpe-link-test를 false로 지정한다.
 ok> setenv tpe-link-test? false
 ok> reset

 

 

stty
1. 문제 개요
    rcp 이나 rsh 명령을 사용할 때 "stty: : Invalid argument"와 같은 에러가
    발생할 수 있다.
2. 문제 원인 및 해결방법
   위 문제는 rcp나 rsh 명령 사용시 상대편 시스템의 사용자 home directory에
   있는 .cshrc 화일에 "stty" 명령으로 terminal 환경을 지정하는 내용이 정의
   되어 있는 경우 발생한다. 예를 들어 .cshrc 화일에 아래와 같이 정의된 경우
   위의 error가 발생 할수 이다.
 

 

stty erase
 stty cs8 -istrip
   해결 방법은 .cshrc 화일을 잠시 다른 이름으로 변경하거나 .cshrc에 정의된
   stty 명령을 comment 처리한 후 rcp나 rsh 명령을 사용한다.
1. 문제 개요
    rcp 이나 rsh 명령을 사용할 때 "stty: : Invalid argument"와 같은 에러가
    발생할 수 있다.
2. 문제 원인 및 해결방법
   위 문제는 rcp나 rsh 명령 사용시 상대편 시스템의 사용자 home directory에
   있는 .cshrc 화일에 "stty" 명령으로 terminal 환경을 지정하는 내용이 정의
   되어 있는 경우 발생한다. 예를 들어 .cshrc 화일에 아래와 같이 정의된 경우
   위의 error가 발생 할수 이다.
 stty erase
 stty cs8 -istrip
   해결 방법은 .cshrc 화일을 잠시 다른 이름으로 변경하거나 .cshrc에 정의된
   stty 명령을 comment 처리한 후 rcp나 rsh 명령을 사용한다.

 

 

NOTICE
1.문제 개요
    이 메세지는 / 루트 화일시스템이 100% 다 사용되었다는 것을 의미한다.
 # df -k
    명령어를 사용하면 / 루트 화일시스템이 100% 다 사용되었다는 것을 확인할 수
    있다.
2.문제 분석
 시스템이 정상적인 운용하면서 발생하는 정보들이 있는데 이 정보는 /var
 디렉토리 밑이 보관된다. 이 디렉토리에 있는 화일중에 필요없이 큰 화일이
 있으면, 지우면 된다. 그리고 테이프로 백업을 받어려고 하다가 테이프
 디바이스명 잘 못 지정하여 화일에다 백업을 받는 경우가 있다.
3.해결 방안
    기술문서  13014  번을 참조한다.

 

 

Not on system console
1.문제 개요
    리모트 시스템으로 telnet 이나 rlogin을 사용하여 root로 로그인할 경우에
    다음과 같은 오류메세지가 발생할 경우가 있다.
 Not on system console
2.문제 원인 및 해결 방안
    Solaris 2.X에서는 디폴트로 root 사용자는 콘솔에서만 로그인할 수 있도록
    설정되어 있다. 이것은 /etc/default/login 화일에 다음과 같이 CONSOLE이
    정의되어 있기 때문이다.
 CONSOLE=/dev/console
    이렇게 CONSOLE이 정의되어 있으면, 지정한 디바이스에서만 root 사용자로
    로그인할 수 있다. 어디에서 든지 root 사용자로 로그인할 수 있게 하려면
    다음과 같이 CONSOLE 정의를 주석으로 처리하면 된다.
 # CONSOLE=/dev/console

 

 

mkdir
1.문제 개요
    /home 디렉토리에서 화일을 만들거나 디렉토리를 만들 때, 다음과 같은
    오류메세지가 발생한다.
 mkdir: Failed to make directory "/home/kmg"; Operation not applicable
   OR
 mkdir: 디렉토리 "/home/xx" 생성 실패; 해당 오퍼레이션이 아님
    이 오류메세지가 나오는 원인은 시스템이 부팅될 때, 디폴트로 /home 디렉토리를
   auto mount하기 위한 mount ponit로 사용하기 때문이다.
2.문제 분석
    /home 디렉토리에 화일이나 디렉토리를 만들려면, /home 디렉토리가 auto mount
    point로 사용되지 못하게 하여야 한다. auto mount 기능이란 특정 NFS 서버에
    사용자의 홈디렉토리를 만들어 두고, 각각의 클라이언트는 서버가 제공하는
    홈디렉토리를 필요할 때마다 자동적으로 마운트되게 하는 것이다.
    이러한 auto mount 기능이 제대로 구현이 되려면 다음과 같은 것이 필요하다.
 1. NFS server/client 설정
 2. NIS server/client 설정
 3. auto mount configuration 설정
3.해결 방안
    /home 디렉토리가 auto mount point로 사용되지 못하게 하려면 /etc/auto_master
    화일에서
     /home           auto_home       -nobrowse
    라인을 comment out하고 시스템을 다시 부팅한다.
 예제) 변경후의 /etc/auto_master
     # Master map for automounter
     #
     +auto_master
     /-              auto_direct     -ro,bg,intr,nosuid
     /net            -hosts          -nosuid,nobrowse
     # /home           auto_home       -nobrowse
     /xfn           -xfn

 

 

Truss를 사용한 프로그램 오류 분석
INFODOC ID: 14141
개요: 커널 도움말: truss를 사용한 프로그램 및 오류 분석
세부 설명:
truss는 시스템 서비스 호출과 인수를 출력하고 상태, 결함 및 신호를 반환하여 프로그램이 어떻게 작동하는지 확인할 수 있는 디버깅 도구입니다. 따라서 truss를 사용하면 쉽게 오류를 디버그하고 프로그램 작동 방법을 이해할 수 있습니다.
이 설명은 2.X 버전을 대상으로 작성되었습니다. SunOS 4.X에는 truss와 비슷한 기능을 하고 truss와 비슷한 방법으로 사용할 수 있는 "trace" 명령이 있습니다.
truss는 사용 방법이 편리합니다. 가장 간단한 형식으로 명령 앞에 "truss"를 입력하면(인수 포함) 여러 가지 정보가 출력됩니다.
기본 설정에 따라 truss 출력은 stdout(정상 출력)가 아닌 stderr(오류 출력)로 출력됩니다. 따라서 쉘 I/O 재지정 토콘에서 쉽게 truss 출력과 프로그램 출력을 구별할 수 있습니다. 또 -o 스위치를 사용하면 truss 출력을 파일로 저장할 수 있습니다.
truss에 스위치를 사용하지 않으면 분기되지 않는 프로세스 출력을 추적합니다.

 

-f 스위치를 사용하면 명령에 지정 된 프로세스 뿐만 아니라 분기된 하위 프로세스까지 모두 추적합니다.
truss에 -p 스위치를 사용하면 실행 중인 프로세스에 대한 추적을 다시 실행하지 않고 시작할 수 있습니다. 의심스러운 프로그램이 잠시 동안 실행되고 나서 충돌이나 문제가 발생할 것 같은 표시나 상태(일종의 출력)가 나올 경우에 이 스위치를 사용하면 좋습니다. 예를 들어, 프로그램이 몇 분 동안 실행된 다음, 간략한 정보가 출력되고 비정상적으로 종료되는 경우가 있습니다. 프로그램을 실행한 다음, 일정한 정보가 출력되면 프로그램이 종료되기 전에 -p 옵션을 사용해서 truss를 실행하십시오. (명령은 "truss -p <프로세스 ID>"입니다.) 그러면 작동을 시작한 후 처음 몇 분 동안의 출력을 기록하지 않아도 truss가 프로그램을 비정상 종료시키는 원인에 대한 단서를 제공합니다.
-t 스위치를 사용하면 truss 출력 대상을 지정된 시스템 서비스 호출 세트로 제한할 수 있습니다. 그러면 사용자가 찾아야 할 내용이 어떤 것인지 알고 있을 경우에 출력량을 줄여서 쉽게 답을 찾을 수 있습니다.

 

o truss를 사용하여 프로그램 실행을 디버그하는 방법.
프로그램이 비정상적으로 종료되지만 충돌이 발생하지 않는 경우에는 일반적으로 시스템 서비스 호출에서 오류가 반환되기 때문입니다. 이것은 프로그래밍 오류일 수도 있고 상황에 따른 오류일 수도 있습니다. truss를 사용하면 문제의 원인을 판단할 수 있습니다.
또 truss를 사용하면 충돌할 때까지 시스템 서비스 호출을 추적하여 프로그램이 충돌한 위치를 디버그할 수 있습니다. 이렇게 출력된 정보와 소스 코드를 사용하여 프로그램이 충돌한 위치를 판단할 수 있습니다.
oo 상황에 따라 오류가 발생하는 프로그램 디버깅.
상황에 따라 오류가 발생하는 프로그램의 예로 "No such file or directory"라는 오류가 발생하는 프로그램이 있습니다. truss는 프로그램이 실행한 open() 시스템 서비스 호출을 모두 나열하여 프로그램이 찾는 파일을 표시합니다.
예를 들어, 다음 명령을 실행합니다.
  cat junk
여기서 "junk"는 실제로 존재하지 않는 파일입니다. "cat" 프로그램에 대하여 truss를 실행하면 마지막 부분에 다음과 같이 표시됩니다.
  fstat(1, 0xEFFFF6C8)    = 0
  open("junk", O_RDONLY)    Err#2 ENOENT
  sigfillset(0xEF744060)    = 0
  cat: cannot open write(2, " c a t :   c a n n o t  ".., 17) = 17
  write(2, " j u n k", 4)    = 4
  write(2, "\n", 1)    = 1
  lseek(0, 0, SEEK_CUR)    = 56338
  _exit(2)

 

 

 

"junk" 파일을 화면에 표시하려면 먼저 이 파일을 열어야 합니다. 위의 "open" 시스템 호출은 첫 번째 인수로 "junk"를 표시하고 두 번째 인수로 O_RDONLY를 표시하여 open() 호출이 읽기 전용 모드로 "junk" 파일을 열기 위한 것임을 나타냅니다. (여기 나오는 인수에 대한 설명은 매뉴얼 페이지 단락 2의 시스템 호출 부분을 참조하십시오.) open() 호출에 대한 반환 결과는 ENOENT 또는 오류 번호 2입니다. 이 상태는 파일을 열 수 없음을 나타내는 "No such file or directory" 오류에 해당합니다. (오류 반환 코드 및 그 의미에 대한 목록은 /usr/include/sys/errno.h 파일을 참조하십시오.)  파일을 열 수 있으면 유효한 파일 기술자("=" 기호와 파일 기술자에 해당하는 번호로 표시)가 반환됩니다.
이벤트 순서에서 open() 호출에 실패하면 종료가 시작됩니다. 프로그램 호출 write()가 두 번 나오고 인수부터 write() 호출까지 프로그램이 오류 메시지를 인쇄하는 것을 알 수 있습니다. 다음은 cat 명령으로 파일을 열 수 없을 때 표시되는 메시지입니다.
   cat: cannot open junk
여기서 두 줄 아래에 마지막 exit()가 있습니다.
이 예에서 "cat" 명령은 열 수 없는 파일을 오류 메시지에 표시하는데, 이 메시지는 truss 출력의 open() 호출 인수와 관련이 있습니다. 다른 프로그램에서는 오류 메시지에 파일 이름이 표시되지 않을 수도 있지만, truss 출력의 끝부분에서 open() 호출을 보면 찾을 수 없는 파일이 어떤 파일인지 확인할 수 있습니다.
oo 프로그래밍 오류가 있는 프로그램 디버깅.
먼저 truss 출력에서 반환된 오류 상태를 찾아보고 나서 시스템 서비스 호출의 인수를 확인하면 프로그래밍 오류를 찾을 수 있습니다. 인수가 잘못되거나 필요없는 인수를 지정하면 시스템 서비스를 호출할 수 없습니다. 대부분의 시스템 호출은 프로그램 충돌없이 서서히 중단됩니다. 그러나 이러한 상황이 발생하면 영향을 받는 변수가 예기치 않은 상태가 되어 프로그램이 충돌할 수 있습니다. 예를 들어, 큰 메모리에 malloc() 명령을 실행하면 메모리에 대한 포인터 대신 NULL 포인터가 반환될 수 있습니다. 나중에 프로그램이 NULL 포인터에 액세스하면 프로그램이 충돌합니다. truss 출력에서 malloc() 명령으로부터 반환된 NULL과 여기에 전달된 비정상적으로 큰 인수를 보면 어떤 상황이 발생했는지 알 수 있습니다.
o Solaris 프로그램의 작동 확인하기.
ps가 어떻게 작동하는지 궁금하십니까? truss를 실행하면 알 수 있습니다. 일정한 작업을 하는 프로그램에 truss를 실행하면 해당 작업을 수행하는 새로운 시스템 호출을 찾을 수 있습니다. 따라서 truss는 중요한 교육용 도구로 사용할 수 있습니다.
예를 들어, ps의 경우에는 다음과 같은 내용을 알 수 있습니다.
execve("/usr/bin/ps", 0xEFFFF910, 0xEFFFF918)  argc = 1
...
...
...
write(1, "       P I D   T T Y    ".., 26) = 26  (1)
open("/proc", O_RDONLY|O_NDELAY)  = 3  (2)
fcntl(3, F_SETFD, 0x00000001)   = 0
fstat(3, 0xEFFFF760)    = 0
getdents(3, 0x00026928, 1048)   = 972  (3)
open("/proc/00000", O_RDONLY)   = 4  (4)
ioctl(4, PIOCPSINFO, 0x00024C58)  = 0  (5)
close(4)     = 0
open("/proc/00001", O_RDONLY)   = 4
ioctl(4, PIOCPSINFO, 0x00024C58)  = 0
close(4)     = 0
...
...
...
open("/proc/01316", O_RDONLY)   = 4
ioctl(4, PIOCPSINFO, 0x00024C58)  = 0
close(4)     = 0
  1316 pts/1    0:00 ksh
write(1, "     1 3 1 6   p t s / 1".., 25) = 25  (6)
open("/proc/01317", O_RDONLY)   = 4
ioctl(4, PIOCPSINFO, 0x00024C58)  = 0
close(4)     = 0
  1317 pts/1    0:00 truss
write(1, "     1 3 1 7   p t s / 1".., 27) = 27
open("/proc/00905", O_RDONLY)   = 4
ioctl(4, PIOCPSINFO, 0x00024C58)  = 0
close(4)     = 0
...
...
...
_exit(0)
이 예에서 ps는 (1) 헤더를 인쇄한 다음, (2) "/proc" 디렉토리를 열고, (3) "/proc" 파일 기술자를 첫 번째 인수로 사용해서 getdents()를 호출하고, (4) "/proc" 디렉토리의 모든 파일을 열기 시작하고, (5) 파일에 ioctl을 실행하여 정보를 얻습니다. (6) 정보가 일정한 조건(이 출력으로는 판단할 수 없지만 ps 명령이 하는 작업을 알면 판단할 수 있음)에 맞으면 프로그램이 결과를 기록합니다. 이 정보가 모두 무엇을 의미할까요? getdents(), "/proc" 및 "PIOCPSINFO"에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오.
o truss는 프로그램 문맥의 환경을 변화시킵니다.
truss는 프로그램의 타이밍을 변경시키기 때문에 찾고 있는 문제의 성격이 변경될 수 있습니다. truss는 시스템 호출 엔트리 포인트에서 프로그램 실행을 중단하고, 인수를 검사하고, 시스템 호출이 반환될 때까지 실행을 다시 시작하고, 반환된 상태를 읽는 동안 실행을 다시 중단하고, 다음 이벤트(결함, 신호 또는 시스템 서비스 호출)가 발생할 때까지 실행을 다시 시작하는 순서로 작동합니다. 단일 스레드의 단일 프로세스 프로그램에서는 이것이 큰 문제가 되지 않습니다. 그러나 시간 조건이나 기타 타이밍 관련 문제로 인해 문제가 발생하는 경우에는 truss를 사용하지 않는 것이 좋습니다.
o 유용한 도구.
truss를 사용하면 프로그램의 내부 작동을 확인할 수 있습니다. 이와 같이 truss는 프로그램을 디버그하고 프로그램의 작동을 이해하는 데 좋은 도구입니다.

 

제품 영역: 커널
제품: 일반
SUNOS 릴리즈: 모든 릴리즈
하드웨어: 모든 하드웨어

[출처] error 문제 -1|작성자 담이당





댓글

💲 추천 글