PTRACE(2)

명칭
ptrace - 프로세스의 트레이스와 디버그

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/ptrace.h> int ptrace(int request, pid_t pid, caddr_t addr, int data)

해설
ptrace() (은)는 트레이스와 디버그의 기능을 제공합니다. 이것에 의해 1 개의 프로세스 (트레이스 하는 프로세스)가 다른 프로세스 (트레이스 되는 프로세스)를 제어할 수 있습니다. 대부분의 경우, 트레이스 되는 프로세스는 정상적으로 실행됩니다. 다만, 트레이스 되는 프로세스는 시그널 ((sigaction) 2 (을)를 참조) (을)를 수신하면(자) 정지합니다. 트레이스 하는 프로세스는, wait(2) 또는 SIGCHLD 시그널에 의해 이것을 검지해, 정지된 프로세스 상태를 조사해, 그것을 종료시키는지, 또는 적절한 형태로 실행을 계속시킵니다. ptrace() (은)는, 이것들 모든 것을 제어하는 메카니즘입니다.

request 인수는, 어느 조작을 실행하는지를 지정합니다. 나머지의 인수의 의미는 조작에 따라서 다릅니다. 후술 하는 1 개(살)의 특수한 케이스를 제외해, ptrace() 호출은 모두 트레이스 하는 프로세스에 의해 행해져 pid 인수는 트레이스 되는 프로세스의 프로세스 ID 를 지정합니다. request (은)는 다음의 것으로 할 수 있습니다.

PT_TRACE_ME
    이 요구는, 트레이스 되는 프로세스가 사용하는 유일한 요구입니다. 이 요구는, 프로세스가 그 부모에 의해 트레이스 되는 것을 선언합니다. 다른 인수는 모두 무시되고 (parent process가 child process를 트레이스 하지 않는 경우는, 꽤 혼란한 결과가 됩니다. 트레이스 되는 프로세스가 정지하면(자), 이 프로세스는, ptrace() 에 의해서 밖에 실행을 계속할 수 없습니다). 프로세스가 이 요구를 사용해, execve(2) 또는 거기에 짜넣어지고 있는 routine (예를 들어, execv(3)) (을)를 호출했을 경우, 그 프로세스는 새로운 이미지의 최초의 인스트럭션을 실행하기 전에 정지합니다. 또, 실행되는 실행 가능 모듈의 setuid 또는 setgid 비트는 무시됩니다.

PT_READ_I, PT_READ_D
    이러한 요구는, 트레이스 되는 프로세스의 address 공간으로부터 1 개의 int 데이터를 읽어냅니다. 종래, ptrace() (은)는 인스트럭션과 데이터에 대해 구별된 address 공간이 있다 머신을 허용 하고 있었습니다. 이것이 2 개의 요구가 있는 이유입니다. 개념적으로는, PT_READ_I 하지만 인스트럭션 공간으로부터 읽어내, PT_READ_D 하지만 데이터 공간으로부터 읽어냅니다. 현재의 FreeBSD 시스템에서는, 이러한 2 개의 요구는 완전하게 동일합니다. addr 인수가, 독해를 한다 (트레이스 되는 프로세스의 가상 address 공간내의) 주소를 지정합니다. 이 주소는 어떠한 경계 조정 제약도 채울 필요는 없습니다. 읽어내진 값은 ptrace() (으)로부터의 반환값으로서 돌려주어집니다.

PT_WRITE_I, PT_WRITE_D
    이러한 요구는 PT_READ_I 및 PT_READ_D (와)과 같습니다만, 읽어내는 것이 아니라 기입하는 곳(중)이 다릅니다. data 인수로 기입해지는 값을 지정합니다.

PT_CONTINUE
    트레이스 되는 프로세스는 실행을 계속합니다. addr (은)는, 실행이 재개되는 장소 (프로그램 카운터의 새로운 값), 또는 실행이 정지되었더니 재개되는 것을 나타낸다 (caddr_t)1 (을)를 지정합니다. data 에는, 트레이스 되는 프로세스가 실행을 재개할 경우에 수신하는 시그널 번호, 또는 시그널을 송신하지 않는 경우에는 0 을 지정합니다.

PT_STEP
    트레이스 되는 프로세스는 1 인스트럭션씩 스텝 실행됩니다. addr 에는 (caddr_t)1 (을)를 건네줄 필요가 있습니다. data 필드는 사용되지 않습니다.

PT_KILL
    트레이스 되는 프로세스는, 마치 SIGKILL (을)를 전달 시그널로서 PT_CONTINUE 하지만 사용되었는지와 같이, 종료합니다.

PT_ATTACH
    이 요구는, 다른 무관계한 프로세스의 제어를 취득해, 그 트레이스를 개시합니다. 트레이스 되는 프로세스로부터의 협력은 필요로 하지 않습니다. 이 케이스에서는, pid 에 트레이스 되는 프로세스의 프로세스 ID 를 지정해, 다른 2 개의 인수는 무시됩니다. 이 요구에서는, 타겟 프로세스가 트레이스 한다 프로세스와 같은 열매 UID 를 가지는 것, 그것이 setuid 또는 setgid 된 실행 가능 모듈이 아닌 것 하지만 요구됩니다 (트레이스 하는 프로세스가 root 로서 실행되고 있다 경우, 이러한 제약은 적용되지 않습니다). 트레이스 하는 프로세스는, 새롭게 트레이스 되는 프로세스를 정지시켜, 마치 최초부터 쭉 트레이스 하고 있었는지와 같이 제어할 수 있습니다.

PT_DETACH
    이 요구는 PT_CONTINUE 와 유사합니다만, 실행을 계속하는 다른 장소를 지정할 수 없는 것, 및 요구가 성공한 후, 트레이스 되고 있던 프로세스는 이미 트레이스 되지 않고, 통상 대로 실행을 계속하는 것이 다릅니다.

한층 더 머신에 고유의 요구가 존재하는 일이 있습니다. i386 그럼, 이것들은 다음과 같습니다.

PT_GETREGS
    이 요구는, 트레이스 되는 프로세스의 머신 레지스터를, addr 하지만 가리킨다 “ struct reg ” (<machine/reg.h> 안에 정의되고 있습니다) 안에 읽어냅니다.

PT_SETREGS
    이 요구는 PT_GETREGS 의 역입니다. addr 하지만 가리킨다 “ struct reg ” (<machine/reg.h> 안에 정의되고 있습니다) (으)로부터 트레이스 되는 프로세스의 머신 레지스터를 로드합니다.

PT_GETFPREGS
    이 요구는 트레이스 되는 프로세스의 부동 소수점 레지스터를 addr 하지만 가리킨다 “ struct fpreg ” (<machine/reg.h> 에 정의되고 있습니다)에 읽어냅니다.

PT_SETFPREGS
    이 요구는 PT_GETFPREGS 의 반대입니다. addr 하지만 가리킨다 “struct fpreg” (<machine/reg.h> 안에 정의되고 있습니다) (으)로부터 트레이스 되는 프로세스의 부동 소수점 레지스터를 로드합니다.

PT_GETDBREGS
    이 요구는 트레이스 되는 프로세스의 디버그 레지스터를 addr 하지만 가리킨다 “ struct dbreg ” (<machine/reg.h> 안에 정의되고 있습니다) 에 읽어냅니다.

PT_SETDBREGS
    이 요구는 PT_GETDBREGS 의 반대입니다. addr (이)가 가리킨다 “ struct dbreg ” (<machine/reg.h> 안에 정의되고 있습니다) (으)로부터 트레이스 되는 프로세스의 디버그 레지스터에 로드합니다.

반환값
몇개의 요구로 ptrace() (은)는 에러 이외의 경우에도 -1 (을)를 돌려줍니다. 애매함을 없애기 위해서(때문에)는, 호출 전에 errno (을)를 0 으로 설정해, 다음에 체크합니다.

에러
ptrace() 함수는 다음의 경우에 처리에 실패합니다.

[ESRCH]
    •   지정된 프로세스 ID 를 가지는 프로세스가 존재하지 않습니다.

[EINVAL]
    •   프로세스가 자기 자신에 대해서 PT_ATTACH (을)를 사용하려고 했습니다.
    •   request 하지만 올바른 요구의 1 개가 아니었습니다.
    •   PT_CONTINUE 에의 시그널 번호 (data) 하지만 0 이 아닌지, 또는 올바른 시그널 번호가 아니었습니다.
    •   PT_GETREGS, PT_SETREGS, PT_GETFPREGS, PT_SETFPREGS, PT_GETDBREGS 또는 PT_SETDBREGS 하지만, 유효한 레지스터 세트를 설정하지 않고 사용되었습니다 (이것이 실로 되는 것은, 통상, 시스템 프로세스에 대한 보고입니다).

[EBUSY]
    •   PT_ATTACH 하지만 이미 트레이스중의 프로세스에 대해 사용되었습니다.
    •   요구를 하고 있는 프로세스 이외의 프로세스에 의해, 트레이스 되는 프로세스를 조작하려고 하는 요구가 시도되었습니다.
    •   요구 (PT_ATTACH 이외의)가 정지되어 있지 않은 프로세스를 지정했습니다.

[EPERM]
    •   요구 (PT_ATTACH 이외의)가, 전혀 트레이스되어 있지 않은 프로세스를 조작하려고 했습니다.
    •   전술의 PT_ATTACH 그리고 설명한 조건을 채우지 않는 프로세스에 대해 PT_ATTACH (을)를 사용하려고 했습니다.

관련 항목
execve(2), sigaction(2), wait(2), execv(3), i386_clr_watch(3), i386_set_watch(3)

역사
ptrace() 함수는 AT&T UNIX 그리고 등장했습니다.