我正在尝试在我自己的进程中监控/重定向syscall。当fwrite在libc中调用write时,LD_PRELOAD无法工作,got/plt挂钩似乎也有同样的问题。我正在寻找基于ptrace的解决方案,但我不能像孩子一样运行fork()并运行主应用程序,因为该应用程序通过信号与其父应用程序通信。
2006年的一个线程建议跟踪程序可以位于与tracee不同的线程组中,但在实践中似乎不起作用:http://yarchive.net/comp/linux/ptrace_self_attach.html
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?
发布于 2016-10-07 23:14:03
我不太清楚你到底在问什么。听起来你已经解决了附加部分(这是最难解决的问题)。如果是这样,那么让进程停止就不是问题了。只需向进程发送一个信号即可。该进程将停止并向您发送一个陷阱,以便您可以决定如何处理该信号。此时,您可以调用ptrace(PTRACE_SYSCALL, pid, 0, 0)。这将在SYSCALL跟踪模式下启动它,并防止您的信号到达被调试对象(因此不会在进程中引入意外信号)。
https://stackoverflow.com/questions/38185391
复制相似问题