문제문 : 프로그램 은 루프로 구성됩니다. 이 프로그램의 실행은 제어 프로세스의 진행 상황을 주기적으로 표시하는 다른 프로세스에 의해 제어되어야합니다. kill(pid, SIGSTOP),
다음에 ptrace(PTRACE_PEEKTEXT,pid,...)
함수는 C 프로세스를 더 이상 찾지 않습니다. 내가 읽은 것에서 ptrace(PTRACE_PEEKTEXT,pid,...
)은 pid
으로 식별 된 프로세스가 중지되었을 때 작동한다고 가정합니다.해당 프로세스가 없음 - ptrace
내가 정확히 무엇을 놓치고 있는지 모르겠다. 그래서 어떤 도움을 주시면 감사하겠습니다. 아래는 내가 지금까지 한 일입니다 :
과 의 두 가지 프로세스가 있습니다.
첫 프로세스 (P)는 ()을 통해 두 번째 프로세스 (C)를 만듭니다.
C의 코드는 다음과 같다 :
int i = 0;
int main() {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
printf("Memory address = %p", (void *)&i);
while(1) { i++;}
}
P의 코드는 다음과 같습니다 :
{...}
switch (pid = fork()) {
case 0: /* the child */
if (execl("C", "", (char *) NULL) == -1) {
perror("execl");
}
break;
case -1: /* Error */
perror("fork");
exit(EXIT_FAILURE);
default: /* the parent */
sleep(1);
kill(pid, SIGSTOP);
wait(&status);
if (WSTOPSIG(status)==SIGSTOP) {
printf("%s","Child was interrupted. Insert memory address\n");
scanf("%p",&address);
printf("Address = %p", address);
data = ptrace(PTRACE_PEEKTEXT, pid, address,NULL);
if(data==-1){
if(errno){
printf("%s\n","Error at PEEKTEXT\n");
printf("%s\n",strerror(errno));
}
if(errno == ESRCH){
printf("%s\n","ESRCH error\n");
}
if(errno == EIO){
printf("%s\n","EIO error\n");
}
}
printf("***Data retrieved is: %ld\n",data);
data = ptrace(PTRACE_CONT, pid, 0, 0);
}
if(WIFEXITED(status)){
printf("[Parent] - Child's exit status is: %d \n", WEXITSTATUS(status));
break;
}
break;
}
{...}
출력은 다음과 같습니다
C에서- : 메모리 주소 = 0x60104c
- 에서 P : 아이가 방해를 받았어. 메모리 주소 (다음 나는 C 인쇄 무엇을 삽입)
주소 = 0x60104c
를 삽입하고 오류는 다음과 같습니다
오류를 PEEKTEXT
그런 과정
ESRCH에서 오류
*** 데이터 검색 됨 i s : -1
저에게 맞는 작품입니다. 필자는 필요한 include를 추가하고 모든 변수를 정의하고 P와 C를 모두 컴파일하여 작동했습니다. 컴파일 할 수있는 완전한 코드를 게시 할 수 있습니까? '... '의 어딘가에 오류가 생길 수 있습니다. 일부 변수에 잘못된 유형이 있습니까? 또한'strace -f -o strace.log./p'를 실행하고'strace.log'에 무엇이 출력되어 있는지 확인하십시오. – afenster
당신이 옳았습니다. 문제는 언급 된 @roxana_roman과 같이'... '입니다. –