使用`PTRACE_TRACEME'进行跟踪时,禁用分叉进程上的SIGSTOP停止

时间:2017-08-03 13:22:42

标签: linux ptrace

根据ptrace文档。

  

在下一个clone(2)停止跟踪并自动开始跟踪新克隆的进程,该进程将以SIGSTOP开头,如果使用PTRACE_EVENT_STOP,则为PTRACE_SEIZE。< / p>

问题是SIGSTOP可能根本不是ptrace引起的 - 甚至用户也可以将此信号发送给进程。在这种情况下,由PTRACE_EVENT_STOP停止的子进程将非常完美。

我自己产生了一个子进程,因此使用PTRACE_TRACEME是开始跟踪它的最佳方式 - 它没有竞争条件。如果我坚持使用PTRACE_SEIZE,那么在我在父进程中调用PTRACE_SEIZE之前,子进程可能已经退出。

有没有办法阻止子进程在使用SIGSTOP进行跟踪时收到普通PTRACE_TRACEME

1 个答案:

答案 0 :(得分:0)

简而言之,你不能。

然而,有好消息。从Linux 3.4版开始,ptrace支持新操作PTRACE_SEIZE。它来自父级而不是子级,因此附加语义有些不同。除此之外,它有一些差异,其中之一是它解决了这个特殊问题。

您需要阅读手册页以获取血腥细节。如果您使用它,几乎所有关于报告事件的方式都会发生变化。这个问题(以及类似问题)正是它被引入的原因,所以如果这个问题困扰你,你绝对应该使用PTRACE_SEIZE而不是PTRACE_TRACEME,尽管有不便之处。