如果进程是ptrace ATTACH

时间:2017-01-20 02:08:26

标签: java linux process ptrace

我遇到了最奇怪的问题:也许有人可以提供帮助。

我有一个用Java编写的守护进程(我在Linux上尝试过最新的Java 8 OpenJDK和Oracle)。它会产生一些进程,并且有一个线程可以监视它们是否完成,同时它将运行其他命令,其中一些可能会杀死进程等。

几乎所有时间都一切都很好。但是,守护程序可以对其子进程执行的操作之一是它可以从中获取核心(不会杀死它们:活动进程的核心)。它通过加载.so并通过JNI调用它来实现这一点,JNI使用ptrace(PTRACE_ATTACH...)暂停子进程并获取核心信息,然后使用ptrace(PTRACE_DETACH...)让它再次运行。

这也很好,我可以看到在核心完成后这个过程正常运行,一切都很好。

除此之外,Java的Process对象现在都很糟糕。每当我在此过程中调用exitValue()时,我总是返回并退出4991的代码(如果您对其进行解码,则表示WIFSTOPPED信号值为19,或SIGSTOP)。这并不奇怪,因为Linux手册页指出ptrace()将父母视为WIFSTOPPED。但问题是,一旦Process对象达到此状态,它将永远不会执行任何其他操作,即使该进程实际上在分离后返回运行。

更为关键的是,即使在该过程真正退出后,exitValue() 仍然返回4991,并且该过程未被收获(它仍然存在于Z(僵尸)状态,因为已不存在)并且永远不会消失,直到我的守护进程被杀死,然后init将继承并收获僵尸进程。

我已经查看了isAlive()的价值(说不),我试图运行waitFor(0, TimeUnit.SECONDS)(说没有运行),但没有一个得到{{1}出于这种破碎的状态 - 这并不会让我感到惊讶,因为我的阅读建议这些方法实际上是用Process方法实现的。

在我看来,这就像Java exitValue()中的一个错误,但我不确定......我已经尝试通过将GDB附加到进程然后将其分离来重现它,但是没有#&# 39; t显示同样的问题。同样地,只使用SIGSTOP / SIGCONT就不会这样做。

任何人都有任何暗示或想法?

0 个答案:

没有答案