在我的项目中,我需要附加到进程,恢复它们,然后使用ptrace分离它们。然而,与errno=ESRCH (No such process)分离失败。
如果我不使用PTRACE_CONT恢复流程,那么分离可以正常工作,但是在这种情况下,进程会停止/没有响应,这在我的项目中是不可接受的。在Arch和Ubuntu 12.04 LTS上测试,结果相同。
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = 21000;
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
perror("PTRACE_ATTACH");
return 1;
}
printf("attached\n");
waitpid(pid, NULL, WUNTRACED);
if (ptrace(PTRACE_CONT, pid, NULL, NULL) == -1) {
perror("PTRACE_CONT");
return 1;
}
printf("continued\n");
if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) {
perror("PTRACE_DETACH");
return 1;
}
printf("detached\n");
return 0;
}产出:
attached
continued
PTRACE_DETACH: No such process发布于 2013-12-11 17:01:19
根据ptrace手册页,在尝试脱离它之前,应该停止该过程:
对拖头的分离是通过以下方式进行的: PTRACE_DETACH,pid,0,sig; PTRACE_DETACH是一个重新启动的操作;因此,它要求tracee处于ptrace中。如果tracee是在信号传递-停止,一个信号可以注入。否则,sig参数可能会被忽略。如果tracee在跟踪程序想要分离它时正在运行,通常的解决方案是发送SIGSTOP (使用tgkill(2),确保它进入正确的线程),等待tracee在信号传递中停止- SIGSTOP停止,然后分离它(抑制SIGSTOP注入)。一个设计错误是,这可以与并发SIGSTOPs进行竞争。另一个复杂的情况是,tracee可能会进入其他的ptrace停止,需要重新启动并再次等待,直到SIGSTOP被看到为止。另一个复杂的问题是要确保tracee还没有停止跟踪,因为它没有发生信号传递--即使是SIGSTOP。
在您的示例代码中,实际上不需要调用ptrace(PTRACE_CONT, ...)。你可以直接脱离这个过程。如果该代码属于较大的代码段,则只需使用tgkill() (如果不使用线程,则只需使用kill ):
ptrace(PTRACE_CONT, ...);
kill(pid, SIGSTOP);
waitpid(pid, NULL, 0);
ptrace(PTRACE_DETACH, ...);https://stackoverflow.com/questions/20510300
复制相似问题