没有这样的过程 – ptrace

问题陈述 :一个程序C由一个循环组成。 这个程序的执行必须由另一个进程来控制,这个进程会周期性地显示受控进程的进程。 kill(pid, SIGSTOP),函数ptrace(PTRACE_PEEKTEXT,pid,...)不会再findC进程。 从我所读到的, ptrace(PTRACE_PEEKTEXT,pid,... )应该在由pid标识的进程停止时工作。

我不知道我错过了什么,所以任何帮助将不胜感激。 以下是我迄今为止所做的:

有两个进程, PC.

第一个进程(P)通过fork()创build第二个进程(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

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