首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ptrace父进程

Ptrace父进程
EN

Stack Overflow用户
提问于 2016-07-04 20:59:04
回答 1查看 695关注 0票数 0

我正在尝试在我自己的进程中监控/重定向syscall。当fwrite在libc中调用write时,LD_PRELOAD无法工作,got/plt挂钩似乎也有同样的问题。我正在寻找基于ptrace的解决方案,但我不能像孩子一样运行fork()并运行主应用程序,因为该应用程序通过信号与其父应用程序通信。

2006年的一个线程建议跟踪程序可以位于与tracee不同的线程组中,但在实践中似乎不起作用:http://yarchive.net/comp/linux/ptrace_self_attach.html

代码语言:javascript
复制
pid = fork();
if (pid == 0) {
    prctl(PR_SET_PTRACER, getppid());
    raise(SIGSTOP);
} else {
    sleep(1);
    ptrace(PTRACE_SEIZE, pid, NULL, NULL);
    for (;;) {
        int status;
        int ret = waitpid(pid, &status, 0);
        warn("wait=%d:", ret);
        ret = ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
        warn("ptrace=%d:", ret);        
    }
}

我面临的问题是,ptrace(PTRACE_SYSCALL)期望tracee处于ptrace-wait状态,也就是说,它必须已经引发了SIGSTOP,而跟踪程序需要等待它。由于在本例中关系是颠倒的(tracer是tracee的子级),因此PTRACE_SYSCALL返回ESRCH。

strace如何跟踪现有的pid?

EN

回答 1

Stack Overflow用户

发布于 2016-10-07 23:14:03

我不太清楚你到底在问什么。听起来你已经解决了附加部分(这是最难解决的问题)。如果是这样,那么让进程停止就不是问题了。只需向进程发送一个信号即可。该进程将停止并向您发送一个陷阱,以便您可以决定如何处理该信号。此时,您可以调用ptrace(PTRACE_SYSCALL, pid, 0, 0)。这将在SYSCALL跟踪模式下启动它,并防止您的信号到达被调试对象(因此不会在进程中引入意外信号)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38185391

复制
相关文章

相似问题

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