没有这样的进程- ptrace

7
问题陈述:一个程序C由一个循环组成。这个程序的执行必须由另一个进程控制,该进程会周期性地显示被控制进程的进度。在kill(pid, SIGSTOP)之后,函数ptrace(PTRACE_PEEKTEXT,pid,...)不能再找到C进程了。根据我所读的,当通过pid标识的进程停止时,ptrace(PTRACE_PEEKTEXT,pid,...)应该可以工作。

我不知道我究竟缺少什么,所以任何帮助都将不胜感激。以下是我迄今为止所做的:

有两个进程,PC

第一个进程(P)通过fork()创建第二个进程(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;        
} 
{...}

输出结果如下:

输出结果为:

  1. 来自C:内存地址= 0x60104c
  2. 来自P:子进程被中断。插入内存地址(接下来我插入C打印的内容)

地址= 0x60104c

错误信息如下:

在PEEKTEXT处出现错误

没有这样的进程

ESRCH错误

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


2
对我来说可以。我添加了必要的包含文件并定义了所有变量,编译了P和C,它们都能正常工作。你能发布完整的可编译代码吗?有没有可能在“...”中出现错误,例如某些变量的类型不正确等?此外,请尝试运行“strace -f -o strace.log ./p”并检查“strace.log”中打印的内容。 - afenster
你是对的,问题就在于 ...,正如 @roxana_roman 所提到的。 - Mirel Vlad
2个回答

6

确保地址变量的类型正确。我尝试使用 void * address 也可以正常工作。当我把地址变量设为 int 时,我遇到了您的错误。


那就是问题所在了。我使用的是“unsigned int”:)。谢谢! - Mirel Vlad
1
考虑过这种可能性,但不确定——很酷你猜对了。会在你的答案上添加一点:在 x86_64 上,地址的大小(对于%p)为8字节,因此当 scanf 尝试将一个值读入 unsigned int(而不是 int *)时,它只是将垃圾放到内存中的其他某个值中,在您的情况下是 pid 变量——因此出现错误。如果它们分配方式不同,那么它可能是其他变量,甚至可以在没有任何错误的情况下工作。如果作者在调用 ptrace 之前打印了 pid 的值,他会看到一些垃圾并找到错误。 - afenster

2

使用waitpid并选择以下选项:

waitpid(pid, &status, WUNTRACED | WCONTINUED)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接