ptrace

PTRACE(2)                  리ëì¤ íë¡ê·¸ë머 매ë´ì¼                 PTRACE(2)



ì´ë¦
       ptrace - íë¡ì¸ì¤ ì¶ì

ì¬ì©ë²
       #include <sys/ptrace.h>

       long int ptrace(enum __ptrace_request request, pid_t pid, void * addr,
       void * data)

ì¤ëª
       ptrace ìì¤í ì½ì ë¶ëª¨ íë¡ì¸ì¤ê° ë¤ë¥¸ íë¡ì¸ì¤ì ì¤íì ê´ì°°íê±°ë ì ì´íë
       ìë¨ì ì ê³µíë¤. ê·¸ë¦¬ê³  í´ë¹ íë¡ì¸ì¤ì ì½ì´ ì´ë¯¸ì§ì ë ì§ì¤í°ë¤ì
       ê²ì¬íê³  ë°ê¿ì ìë ìë¨ë ì ê³µíë¤.  ì´ í¨ìë ì°ì  breakpoint ëë²ê¹ê³¼ ìì¤í
       ì½ ì¶ì ì ìííëë° ì¬ì©ëë¤.


       ë¶ëª¨ íë¡ì¸ì¤ë fork(2)를 í¸ì¶íì¬ ì¶ì ì ììí ì ìì¼ë©° exec(2)ë¤ìì
       (ì íì ì¼ë¡) PTRACE_TRACEME를 íë ê²°ê³¼ ìì íë¡ì¸ì¤ë¥¼ ê°ì§ì ìë¤.
       ì íì ì¼ë¡, ë¶ëª¨ íë¡ì¸ì¤ë PTRACE_ATTACH를 ì¬ì©íì¬ ì¡´ì¬íë íë¡ì¸ì¤ì
       ì¶ì ì ììí ì ìë¤.


       íë¡ì¸ì¤ë¥¼ ì¶ì íë ëì, ë¹ë¡ ì í¸ê° 무ìëë¤ í ì§ë¼ë ì í¸ê° ëì°©í ëë§ë¤ ìì
       íë¡ì¸ì¤ë ë©ì¶ê²ì´ë¤.  (ìì¸ë SIGKILLì´ë©° ì´ ì í¸ë ìì ì ìë í¨ê³¼ë¥¼
       ê°ì§ë¤.)  ë¶ëª¨ íë¡ì¸ì¤ë ë¤ì wait(2)ìì ì¸ìëë©° ë©ì¶ë ëì ìì íë¡ì¸ì¤ë¥¼
       ìì  íë¤.  ê·¸ë¦¬ê³  ë¶ëª¨ íë¡ì¸ì¤ë ìì íë¡ì¸ì¤ê° ê³ìíëë¡ ì¼ê¸°íë©°
       ìµìì¼ë¡ ì ë¬ë ì í¸ë¥¼ 무ìí ì ìë¤.(ëë ë¤ë¥¸ ì í¸ê° ëì  ì ë¬ëë¤ í ì§ë¼ë)


       ë¶ëª¨ íë¡ì¸ì¤ê° ì¶ì ì ë§ì¹ ë, ë¶ëª¨ë PTRACE_KILL를 ê°ì§ ìì íë¡ì¸ì¤ë¥¼
       ì¢ë£ìí¤ê±°ë PTRACE_DETACH를 íµí´ ì¶ì ì ìíë 모ëìì ë³´íµ ì¤íì ê³ìíëë¡
       íë¤.


       requestì ê°ì íí´ì ¸ì¼í  íëì ê²°ì íë¤:

       PTRACE_TRACEME
              ì´ íë¡ì¸ì¤ë ì´ íë¡ì¸ì¤ì ë¶ëª¨ì ìí´ ì¶ì ëì´ ì§ë¤ëê²ì ê°ë¦¬í¨ë¤.
              ì´ íë¡ì¸ì¤ì ì ë¬ë ì í¸(SIGKILLì ì ì¸)ë íë¡ì¸ì¤ ì¶ì ì ë©ì¶ê³
              ë¶ëª¨ íë¡ì¸ì¤ê° wait를 ì¸ìíëë¡ ì¼ê¸°íë¤.  ëí, ì´ íë¡ì¸ì¤ì ìí´
              execëë ëª¨ë  ì°ìì ì¸ ì½ë¤ì ìë¡ì´ íë¡ê·¸ë¨ì´ ì¤íí기 ì ì ì ì´ë¥¼
              ì»ì 기í를 보모 íë¡ì¸ì¤ìê² ì£¼ê¸° ìí´ SIGTRAPì ì¼ê¸°íë¤.
              íë¡ì¸ì¤ë ë¶ëª¨ íë¡ì¸ì¤ê° ì¶ì ì 기ëíì§ ìëë¤ë©´ ì´ë°
              ì구(request)를 ë§ë¤ì´ìë ìëë¤.(pid, addr, ê·¸ë¦¬ê³  data ë
              무ìëë¤.)

       ìì requestë ìì íë¡ì¸ì¤ì ìí´ìë§ ì¬ì©ëë¤.; ë머ì§ë ë¶ëª¨ì ìí´ìë§ ì¬ì©ëë¤.
       ë¤ì request ë¤ì¤ì, pidë ìëíë ìì íë¡ì¸ì¤ë¥¼ ê°ë¦¬í¨ë¤.  PTRACE_KILLì¸
       ë¤ë¥¸ requestë¤ì ìí´ì ìì íë¡ì¸ì¤ë ë©ì¶ì´ì ¸ì¼ íë¤.

       PTRACE_PEEKTEXT, PTRACE_PEEKDATA
              ìì íë¡ì¸ì¤ ë©ëª¨ë¦¬ì addrìì¹ì ìë(word)를 ì½ê³  ptrace ì½ì
              ê²°ê³¼ë¡ì¨ ìë를 ë°ííë¤.  리ëì¤ë textì data 주ì ê³µê°ì
              ë¶ë¦¬íì§ ìëë¤. ê·¸ëì ëê°ì requestë íì¬ ê°ë¤.(dataë 무ìëë¤.)


       PTRACE_PEEKUSER
              ë ì§ì¤í°ì íë¡ì¸ì¤ì ê´í ë¤ë¥¸ ì 보를 ê°ì§ê³  ìë ìì íë¡ì¸ì¤ì
              USER ê³µê°ì ìë ë³ì addr ì ìë를 ì½ëë¤.  (<linux/user.h> ì
              <sys/user.h> 를 참조í´ë¼.)  wordë ptrace ìì¤í ì½ì ê²°ê³¼ë¡ì¨
              ë°íëë¤.  ì íì ì¼ë¡ ë³ìë ìí¤íì³ì ìí´ ë°ëë¤ í ì§ë¼ë,
              ìë-ì ë ¬ì´ì´ì¼ íë¤.  (dataë 무ìëë¤.)


       PTRACE_POKETEXT, PTRACE_POKEDATA
              ë¶ëª¨ íë¡ì¸ì¤ ë©ëª¨ë¦¬ì ìë ìì¹ dataìì ìì íë¡ì¸ì¤ ë©ëª¨ë¦¬ì ìë
              ìì¹ addrì¼ë¡ word를 ë³µì¬íë¤.  ìì²ë¼, ë requestë íì¬ ê°ë¤.

       PTRACE_POKEUSER

              ë¶ëª¨ íë¡ì¸ì¤ ë©ëª¨ë¦¬ì ìë ìì¹ dataìì ìì íë¡ì¸ì¤ì addr USER ìì‐
              ì¼ë¡ word를 ë³µì¬íë¤.  ìì²ë¼, ë³ìë ì íì ì¼ë¡ ìë-ì ë ¬ì´ì´ì¼
              íë¤. 커ëì 무결ì±ì ì ì§í기 ìí´, USER ììì ëí ìì ì íì©ëì§ ìëë¤.


       PTRACE_GETREGS, PTRACE_GETFPREGS
              ìì íë¡ì¸ì¤ì ë²ì© ëë ë¶ë ììì  ë ì§ì¤í°ë¤ì ê°ê° ë¶ëª¨ íë¡ì¸ì¤ì
              data ìì¹ë¡ ë³µì¬íë¤.  ì´ ë°ì´í°ì í¬ë§·ì ê´í ì 보를 ìí´ìë
              <linux/user.h>를 참조í´ë¼.  (addrë 무ìëë¤.)


       PTRACE_SETREGS, PTRACE_SETFPREGS
              ë¶ëª¨ íë¡ì¸ì¤ì data ìì¹ìì ìì íë¡ì¸ì¤ì ë²ì© ëë ë¶ë ììì
              ë ì§ì¤í°ë¤ì ê°ê° ë³µì¬íë¤.  PTRACE_POKEUSER ì²ë¼, ëªëª ë²ì©
              ë ì§ì¤í° ìì ì íì©ëì§ ìëë¤.(addrë 무ìëë¤.)


       PTRACE_CONT
              ì¤ì§ë ìì íë¡ì¸ì¤ë¥¼ ë¤ì ììíë¤. ë§ì¼ dataê° 0ë SIGSTOPë ìëë¼ë©´,
              ì´ê²ì ìììê² ì ë¬ëì´ì¼ íë ì í¸ë¡ì¨ í´ìëë¤.; ê·¸ë ì§ ìì¼ë©´, ì´ë¤
              ì í¸ë ì ë¬ëì§ ìëë¤.  ì를 ë¤ì´, ë¶ëª¨ íë¡ì¸ì¤ë ìììê² ë³´ë´ì§
              ì í¸ê° ì ë¬ë ì§ ìëì§ë¥¼ ì ì´í ì ìë¤.(addrë 무ìëë¤.)


       PTRACE_SYSCALL, PTRACE_SINGLESTEP
              PTRACE_CONTì²ë¼ ì¤ì§ë ììì íë¡ì¸ì¤ë¥¼ ë¤ì ììíë¤. ê·¸ë¬ë ììì ë¤ì
              ìí¸ë¦¬ìì ì¤ì§íëë¡ ì¬ë°°ì´ íê±°ë ìì¤í ì½ìì ì¢ë£íê±°ë ë¨ì¼ ëªë ¹ì´
              ì¤ííì ì¢ë£íë¤.(ë³´íµì²ë¼, ììì ëí ì í¸ë¥¼ ë°ë ì¦ì ì¢ë£íë¤.)
              ë¶ëª¨ íë¡ì¸ì¤ì ê´ì ìì, ìì íë¡ì¸ì¤ë SIGTRAPì ë°ì ì¢ë£ëê²ì²ë¼
              ë³´ì¼ ê²ì´ë¤. ì를 ë¤ì´ PTRACE_SYSCALL를 ìí ìê°ì ì²ì ì¤ì§ì ìì¤í
              ì½ì ìí ì¸ìë¤ì ì¡°ì¬íê³  ê·¸ë¦¬ê³  ë¤ë¥¸ PTRACE_SYSCALLì íê³
              ëë²ì§¸ ì¤ì§ìì ìì¤í ì½ì ë°íê°ì ì¡°ì¬íë ê²ì´ë¤.(addrë 무ìëë¤.)


       PTRACE_KILL
              ì¢ë£íëë¡ í기 ìí´ SIGKILLì ìììê² ë³´ë¸ë¤.(addrì dataë 무ìëë¤.)


       PTRACE_ATTACH
              pidë¡ ì§ì ë íë¡ì¸ì¤ì ë¶ì°©ìí¤ê³ , íì¬ íë¡ì¸ì¤ì "child"를
              ì¶ì íëë¡ ë§ë ë¤.; ìì íë¡ì¸ì¤ì íëì ë§ì¹ PTRACE_TRACEMEê° íëê²ì²ë¼
              ì´ë¤.  ì¤ì ë¡ íì¬ íë¡ì¸ì¤ë ëë¶ë¶ì 목ì ì ìí´ ìì íë¡ì¸ì¤ì ë¶ëª¨ê°
              ëë¤.  (ì¦, ìì ì´ë²¤í¸ì íµì§ë¥¼ ë°ì¼ë©° ììì ë¶ëª¨ì²ë¼ ps(1)ì
              ëíëë¤.) ê·¸ë¬ë ììì ìí getpid(2)ë ì¬ì í ìë ë¶ëª¨ì pid를 ë°ííë¤.
              ììì SIGSTOPì ë³´ë´ì§ë§, ì´ ìì¤í ì½ì ìí´ ì¤ì§ë  íìë ìë¤.; ììì´
              ì¤ì§ëëê²ì 기ë¤ë¦¬ê¸° ìí´ wait를 ì¬ì©í´ë¼.  (addr 그리ê³
              data ë 무ìëë¤.)


       PTRACE_DETACH
              PTRACE_CONTì²ë¼ ì¤ì§ë ììì ë¤ì ììíë¤. ê·¸ë¬ë ì°ì  íë¡ì¸ì¤ìì
              ë¶ë¦¬íê³  PTRACE_ATTACHì ì¬ ë¶ëª¨í í¨ê³¼ì PTRACE_TRACEMEì
              결과를 ìëëë¡ ëë린ë¤. ë¹ë¡ ìëíì§ ììë¤ í ì§ë¼ë, 리ëì¤ìì
              ì¶ì ëë ììì ì¶ì ì ììí ë ì¬ì©ë ë°©ë²ì ê´ê³ìì´ ì´ ë°©ìì¼ë¡ ë¶ë¦¬ë ì
              ìë¤.(addrë 무ìëë¤.)


주ì
       ptrace ì ì¸ìê° ì£¼ì´ì§ ìíì ë°ë¼ í´ìë¨ìë ë¶êµ¬íê³ , GNU libcë íì¬
       requestì¸ìë§ì´ ê³ ì ë ê°ë³ í¨ìë¡ì¨ ptrace 를 ì ì¸íë¤.  ì´ê²ì ë¹ë¡
       문ìíëì§ ìì gcc(1) íëì ì¬ì©íë¤ í ì§ë¼ë ë¶íìí ì¶ì  ì¸ìë¤ì ìëµíë¤ë ê²ì
       ì미íë¤.

       pid 1ì¸ íë¡ì¸ì¤ init(8)ë ì¶ì ëì§ ìëë¤.

       ë©ëª¨ë¦¬ ë´ì©ê³¼ USER ììì ë°°ì¹ë OSì ìí¤íì³ì ë°ë¼ ì¾ ë¤ë¥´ë¤.


       "word"ì í¬ê¸°ë OSì ìí´ ê²°ì ëë¤.(ì¦, 32-bit 리ëì¤ìì wordë 32
       bitsì´ë¤.)


       ì¶ì ì ì¶ì ëë íë¡ì¸ì¤ì ìë¯¸ë¡ ìì ì½ê°ì 미ë¬í ì°¨ì´ë¥¼ ì¼ê¸°íë¤.  ì를
       ë¤ì´, ë§ì¼ íë¡ì¸ì¤ê° PTRACE_ATTACHë¡ ë¶ì°©ëë¤ë©´ ì´ íë¡ì¸ì¤ì ìë ë¶ëª¨
       íë¡ì¸ì¤ë ëì´ì ì´ íë¡ì¸ì¤ê° ë©ì¶ë wait를 íµí´ ì§ì를 ë°ìì ìë¤.
       ê·¸ë¦¬ê³  ì ë¶ëª¨ íë¡ì¸ì¤ê° í¨ê³¼ì ì¼ë¡ ì´ ì§ì를 ë°ì ë°©ë²ë ìë¤.

       ì´ íì´ì§ë ptrace ì½ì´ íì¬ ë¦¬ëì¤ìì ìëëë ë°©ë²ì 문ìí íë¤.  ì´ í¨ìì íëì
       Unixì ì±í¥ì ë°ë¼ ìë¹í ë¤ë¥´ë¤.  ì´ë¤ ê²½ì°, ptrace ì ì¬ì©ì OSì ìí¤íì³ì
       ë§¤ì° ìì¡´ì ì´ë¤.


       SunOS 맨 íì´ì§ë "ì ì¼íê³  ì 매í"ì´ë¼ê³  ptrace 를 기ì íë¤.  Solaris
       2ì ìë proc-ê¸°ë° ëë²ê¹ ì¸í°íì´ì¤ë ë ê°ë ¥íê³  ì¼ë°ì ì¸ ptrace 기ë¥ì
       ìííë¤.


ë°íê°
       ì±ê³µì, PTRACE_PEEK* requestë¤ì ë¤ë¥¸ requestë¤ì´ 0ì ë°ííë ëìì ì구ë
       ë°ì´í°ë¥¼ ë°ííë¤.  ì¤í¨ì, ëª¨ë  requestë¤ì -1ì ë°ííë©° errno(3)ë ì ë¹í
       ê°ì¼ë¡ ì¤ì ëë¤.  PTRACE_PEEK* requestê° ì±ê³µì ë°íëë ê°ì´ -1ì¼ìë ì기
       ë문ì, í¸ì¶ìë request íì ìë¬ê° ë°ìíëì§ ìëì§ë¥¼ ê²°ì í기 ìí´ errno 를
       ê²ì¬í´ì¼ íë¤.


ìë¬
       EPERM  ì§ì ë íë¡ì¸ì¤ë ì¶ì ë ì ìë¤. ì´ê²ì ë¶ëª¨ íë¡ì¸ì¤ê° 충ë¶í ì°ì ê¶ì
              ê°ì§ê³  ìì§ ì기 ë문ì´ë¤; ë¹-ë£¨í¸ íë¡ì¸ì¤ë¤ì ì í¸ë¥¼ ë³´ë¼ì
              ìê±°ë setuid/setgidë¡ ëìê°ë íë¡ê·¸ë¨ì íë¡ì¸ì¤ë¤ì ì¶ì í ì ìë¤.
              ì íì ì¼ë¡, íë¡ì¸ì¤ê° ì´ë¯¸ ì¶ì ëê³  ìê±°ë initì´ë¤.  (pid 1).

       ESRCH  ì§ì ë íë¡ì¸ì¤ê° ì¡´ì¬íì§ ìê±°ë, íì¬ í¸ì¶ìì ìí´ ì¶ì ëì§ ìê±°ë
              충ì§ëì§ ììë¤. (ì¶ì ì ì구íë requestë¤ ë문ì)

       EIO    request ê° ë¬´í¨íê±°ë ë¶ëª¨ë ììì ë©ëª¨ë¦¬ì ìë ì í¨íì§ ìë ìììì
              ì½ê±°ë ììì¼ë¡ ì¸ë ¤ê³  íë ìëê° ë°ìíë¤.  ëë ìë-ì ë ¬ ìë°ì´ ìê±°ë
              ì í¨íì§ ìë ì í¸ê° reqeust ì¬ììëì ì§ì ëë¤.


       EFAULT ë¶ëª¨ë ììì ë©ëª¨ë¦¬ì ìë ì í¨íì§ ìì ìììì ì½ê±°ë ì¸ë ¤ê³  íë ìëê°
              ììë¤. ìë§ë ììì´ ëìëì§ ììê±°ë ì ê·¼í ì ì기 ë문ì´ë¤.  ë¶ííê²ë,
              리ëì¤ìì ì´ ìë¬ì ê´í ë¤ë¥¸ ë³íì ì½ê° ì 매íê² EIO ë EFAULT를
              ë°ííë¤.

í¸í
       SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3

ê´ë ¨ í목
       exec(3), wait(2), signal(2), fork(2), gdb(1), strace(1)

ìì
       ì ê°í <skyeyes@soback.kornet.net>, 2000ë 9ì 21ì¼



Linux 2.2.10                     1999ë 11ì 7ì¼                       PTRACE(2)