没有这样的过程 - ptrace

时间:2014-10-17 19:53:17

标签: c linux process fork ptrace

问题陈述:程序 C 由循环组成。该程序的执行必须由另一个定期显示受控过程进度的过程控制。在kill(pid, SIGSTOP),后,函数ptrace(PTRACE_PEEKTEXT,pid,...)找不到 C 进程。根据我的阅读,ptrace(PTRACE_PEEKTEXT,pid,...)应该在pid标识的进程停止时起作用。

我不知道究竟是什么遗漏,所以任何帮助都将不胜感激。以下是我到目前为止所做的事情:

有两个流程, P C

第一个过程(P)通过 fork() 创建第二个过程(C)。

C&C的代码是这样的:

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

P&#39>代码如下:

{...}
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:孩子被打断了。插入内存地址(下一个我插入C打印的内容)
  3. 地址= 0x60104c

    错误是:

    PEEKTEXT错误

    没有这样的过程

    ESRCH ERROR

    ***检索到的数据是:-1

1 个答案:

答案 0 :(得分:5)

确保地址变量的类型正确。我尝试了void * address,它也适用于我。我通过int使用地址变量

来解决您的错误