2014-10-17 5 views
5

문제문 : 프로그램 은 루프로 구성됩니다. 이 프로그램의 실행은 제어 프로세스의 진행 상황을 주기적으로 표시하는 다른 프로세스에 의해 제어되어야합니다. 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에서
  1. : 메모리 주소 = 0x60104c
  2. 에서 P : 아이가 방해를 받았어. 메모리 주소 (다음 나는 C 인쇄 무엇을 삽입)

주소 = 0x60104c

를 삽입하고 오류는 다음과 같습니다

오류를 PEEKTEXT

그런 과정

ESRCH에서 오류

*** 데이터 검색 됨 i s : -1

+2

저에게 맞는 작품입니다. 필자는 필요한 include를 추가하고 모든 변수를 정의하고 P와 C를 모두 컴파일하여 작동했습니다. 컴파일 할 수있는 완전한 코드를 게시 할 수 있습니까? '... '의 어딘가에 오류가 생길 수 있습니다. 일부 변수에 잘못된 유형이 있습니까? 또한'strace -f -o strace.log./p'를 실행하고'strace.log'에 무엇이 출력되어 있는지 확인하십시오. – afenster

+0

당신이 옳았습니다. 문제는 언급 된 @roxana_roman과 같이'... '입니다. –

답변

5

주소 변수의 유형이 올바른지 확인하십시오. 내가 void * address와 함께 노력했고 그것은 나를 위해 일했다. 주소 변수에 을 사용하여 오류가 발생했습니다.

+0

그게 문제였습니다. 나는'unsigned int'를 사용하고 있었다. :) 감사! –

+1

이 가능성에 대해 생각해 보았지만 확신 할 수는 없습니다. 답에 비트를 추가합니다 : 주소의 크기 ('% p'에 대한)는 x86_64에서 8 바이트입니다. 그래서'scanf'가 값을'int *'대신에'unsigned int'로 읽을 때, 쓰레기를 메모리에있는 다른 값으로 바꾼다. 그리고 여러분의 경우에는'pid' 변수이므로 오류가 발생한다. 다르게 할당 된 다른 변수 일 수도 있고 오류없이 작동 할 수도 있습니다.필자가'ptrace'를 호출하기 전에'pid'의 값을 출력한다면 그는 약간의 쓰레기를 보았을 것이고 오류를 발견했을 것입니다. – afenster

+0

나는 정확한 설명을 알지 못했다. 정말 고마워! –