首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PTRACE_DETACH在PTRACE_CONT和errno=ESRCH之后失败

PTRACE_DETACH在PTRACE_CONT和errno=ESRCH之后失败
EN

Stack Overflow用户
提问于 2013-12-11 04:07:12
回答 1查看 3.5K关注 0票数 4

在我的项目中,我需要附加到进程,恢复它们,然后使用ptrace分离它们。然而,与errno=ESRCH (No such process)分离失败。

如果我不使用PTRACE_CONT恢复流程,那么分离可以正常工作,但是在这种情况下,进程会停止/没有响应,这在我的项目中是不可接受的。在Arch和Ubuntu 12.04 LTS上测试,结果相同。

代码语言:javascript
复制
#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;
}

产出:

代码语言:javascript
复制
attached
continued
PTRACE_DETACH: No such process
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 ):

代码语言:javascript
复制
ptrace(PTRACE_CONT, ...);
kill(pid, SIGSTOP);
waitpid(pid, NULL, 0);
ptrace(PTRACE_DETACH, ...);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20510300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档