2014-10-17 65 views
5

問題說明:程序C由一個循環組成。該程序的執行必須由另一個進程控制,該進程將定期顯示受控進程的進度。在kill(pid, SIGSTOP),之後,功能ptrace(PTRACE_PEEKTEXT,pid,...)不會再找到C過程。從我讀到的ptrace(PTRACE_PEEKTEXT,pid,...)當pid標識的進程停止時應該工作。沒有這樣的過程 - ptrace

我不知道我錯過了什麼,所以任何幫助將不勝感激。以下是我迄今爲止所做的:

有兩個過程,PC

第一個過程(P)通過fork()創建第二個(C)

C'S碼是這樣的:

int i = 0; 
int main() { 
    ptrace(PTRACE_TRACEME, 0, NULL, NULL); 
    printf("Memory address = %p", (void *)&i); 
    while(1) { i++;} 
} 

普的代碼如下:

{...} 
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;   
} 
{...} 

的輸出是:

  1. 從C:存儲器地址= 0x60104c
  2. 從P:小孩被打斷了。在PEEKTEXT

    沒有這樣的進程

    ESRCH

    錯誤:插入內存地址(下我插入C滌棉什麼)

地址= 0x60104c

而且錯誤是錯誤

***數據檢索我s:-1

+2

適用於我。我添加了必要的包含並定義了所有變量,編譯了P和C並且它工作正常。你能發佈可以編譯的完整代碼嗎?在'...'某處發生錯誤,例如某些變量的類型不正確等?此外,請嘗試運行'strace -f -o strace.log。/ p'並檢查'strace.log'中打印的內容。 – afenster 2014-10-17 20:26:04

+0

你說得對,問題出現在@ ...之中,就像@roxana_roman提到的那樣。 – 2014-10-17 20:45:42

回答

5

確保地址變量的類型正確。我試過void * address,它也適用於我。我通過使用地址變量int得到了您的錯誤

+0

這就是問題所在。我正在使用'unsigned int' :)。謝謝! – 2014-10-17 20:44:26

+1

想到這種可能性,但並不確定 - 酷,你猜對了。將添加一點到您的答案:地址的大小(對於'%p')是x86_64上的8個字節,所以當'scanf'試圖讀取一個值到'unsigned int'(而不是'int *')它只是把垃圾到內存中的其他值,在你的情況下,它是'pid'變量 - 因此是錯誤。如果它們的分配方式不同,它可能是其他變量,或者甚至可以毫無錯誤地工作。如果作者在調用'ptrace'之前打印了'pid'的值,他會看到一些垃圾,並且會發現一個錯誤。 – afenster 2014-10-17 20:51:32

+0

我不知道確切的解釋,非常感謝! – 2014-10-17 23:01:54