问题陈述 :一个程序C由一个循环组成。 这个程序的执行必须由另一个进程来控制,这个进程会周期性地显示受控进程的进程。 kill(pid, SIGSTOP),
函数ptrace(PTRACE_PEEKTEXT,pid,...)
不会再findC进程。 从我所读到的, ptrace(PTRACE_PEEKTEXT,pid,...
)应该在由pid
标识的进程停止时工作。
我不知道我错过了什么,所以任何帮助将不胜感激。 以下是我迄今为止所做的:
有两个进程, P和C.
第一个进程(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; } {...}
输出是:
地址= 0x60104c
而错误是:
错误在PEEKTEXT
没有这样的过程
ESRCH错误
***数据检索是:-1
确保地址变量是正确的类型。 我尝试了void * address
,它也适用于我。 我得到了你的错误通过使用int
地址变量