没有这样的过程 - ptrace

Mir*_*lad 6 c linux ptrace fork process

问题陈述:程序C由循环组成.该程序的执行必须由另一个定期显示受控过程进度的过程控制.kill(pid, SIGSTOP),函数后ptrace(PTRACE_PEEKTEXT,pid,...)不再找到C进程.从我所读到的,ptrace(PTRACE_PEEKTEXT,pid,...),当被识别的过程pid停止时,它应该工作.

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

有两个过程,PÇ.

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

C的代码是这样的:

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

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;        
} 
{...}
Run Code Online (Sandbox Code Playgroud)

输出是:

  1. 从C:内存地址= 0x60104c
  2. 来自P:孩子被打断了.插入内存地址(下一个我插入什么C打印)

地址= 0x60104c

错误的是:

PEEKTEXT出错

没有这样的过程

ESRCH错误

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

Rox*_*man 5

确保地址变量的类型正确.我试过了void * address ,它也适合我.我通过使用int地址变量得到了你的错误