问题陈述:程序C由循环组成。此程序的执行必须由另一个进程控制,该进程将定期显示受控进程的进度。kill(pid,SIGSTOP)之后,函数ptrace(ptrace\u peek text,pid,…)不再找到C进程。根据我所读到的,ptrace(ptrace_peek text,pid,)应该在pid标识的进程停止时工作
我不知道我到底错过了什么,所以任何帮助都将不胜感激。以下是我迄今为止所做的工作:
有两个过程,p和C
第一个进程(p)通过fork()创建第二个进程(C)
C的代码如下所示:
inti=0;
int main(){
ptrace(ptrace_TRACEME,0,NULL,NULL);
printf(“内存地址=%p”,(void*)和i);
而(1){i++;}
}
p的代码如下:
{…}
开关(pid=fork()){
案例0:/*子案例*/
如果(execl(“C”,“char*)NULL)=-1){
perror(“execl”);
}
打破
案例-1:/*错误*/
佩罗尔(“福克”);
退出(退出失败);
默认值:/*父项*/
睡眠(1);
压井(pid、SIGSTOP);
等待(状态);
如果(WSTOPSIG(状态)=SIGSTOP){
printf(“%s”,“子项被中断。插入内存地址\n”);
scanf(“%p”和地址);
printf(“地址=%p”,地址);
数据=ptrace(ptrace_peek文本,pid,地址,NULL);
如果(数据==-1){
如果(错误号){
printf(“%s\n”,“文本出现错误”\n”);
printf(“%s\n”,strerror(errno));
}
if(errno==ESRCH){
printf(“%s\n”,“ESRCH错误\n”);
}
如果(errno==EIO){
printf(“%s\n”,“EIO错误\n”);
}
}
printf(“***检索到的数据为:%ld\n”,数据);
数据=ptrace(ptrace_CONT,pid,0,0);
}
如果(妻子退出(状态)){
printf(“[Parent]-子项的退出状态为:%d\n”,WEXITSTATUS(status));
打破
}
打破
}
{...}
输出为:
- 来自C:内存地址=0x60104c
- P:孩子被打断了。插入内存地址(下一步我插入C打印的内容)
地址=0x60104c
而错误是:
查看文本时出错
没有这样的过程
ESRCH误差
***检索到的数据为:-1
确保address变量的类型正确。我试过使用void*address,它对我也有效。我通过对地址变量使用int得到了您的错误