ptrace和waitpid有什么关联?为何缺少waitpid会触发无此进程错误
原因分析
ptrace的PTRACE_ATTACH操作是异步流程:
- 你调用
ptrace(PTRACE_ATTACH, pid, NULL, NULL)成功返回,仅代表内核接收了你的attach请求,并不代表目标进程已经进入可被trace控制的停止状态。内核收到attach请求后,会向目标进程发送SIGSTOP信号,目标进程响应该信号、完成trace上下文绑定的过程是和当前进程并行执行的。 - 如果你跳过
waitpid直接调用PTRACE_DETACH,此时目标进程还没有完成attach流程,内核会判定当前进程并没有成功attach到对应pid上,就会返回ESRCH错误,也就是你看到的“没有该进程”的报错。 - 加了
waitpid(pid, NULL, WUNTRACED)之后,调用会阻塞直到目标进程进入停止状态,此时attach流程已经全部完成,后续的PTRACE_DETACH就能被内核正常处理。
补充说明
所有ptrace操作(包括读寄存器、改内存、单步等)都必须在waitpid捕获到目标进程的停止事件之后才能执行,否则都会出现类似的异常报错。
内容的提问来源于stack exchange,提问作者mark25789
相关产品推荐
相关产品推荐

