Manpages

이 름

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을 자 식 에 게 보 낸 다 .(addrdata는 무 시 된 다 .)

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 [AT] soback.net>, 2000년 9월 21일