Java 与 Eclipse 死锁 CDT 无头构建

Java deadlock with Eclipse CDT headless build

我的情况与此类似: Eclipse CDT Headless build hangs after build is finished,但我稍微研究了一下,发现了其他问题。

场景:我在 Linux (Debian Jessie 8.2) 上有一个 C++ 应用程序和一个 Jenkins 构建服务器。我的开发环境中有 Eclipse CDT,它完美地构建了我的 C++ 应用程序(本地构建)。我在构建服务器上安装了 Eclipse CDT,我的 Jenkins 脚本 运行 是一个无头构建来构建我的应用程序。

问题:即使在构建完成后,Jenkins 也会挂起。但这不是詹金斯的错。我从等式中删除了 Jenkins,并在构建服务器中进行了 Eclipse headlessbuild,结果是一样的,它在打印出 "Build Finished" 后挂起。值得注意的是,如果我在构建服务器中打开 Eclipse CDT 并使用 UI.

触发构建,我可以成功构建我的应用程序

版本:在构建服务器中,我尝试了Java 1.7 和1.8。至于 Eclipse,我尝试了 Kepler、Luna、Mars 和 Neon(最后一个需要 Java 1.8)。为此 post,我使用的是:

java -version
java version "1.7.0_111"
OpenJDK Runtime Environment (IcedTea 2.6.7) (7u111-2.6.7-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)

命令:这是我使用的用于无头构建的 Eclipse CDT 命令:

~/eclipse/eclipse -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import ~/myAppProj/ -build myAppProj/Release -data ~/workspace/

观察结果

  1. 当Java挂起时,我可以杀死它的进程并获取可执行文件 可以用了。当我从 Jenkins 触发构建并杀死它时 死锁 Java 进程,Jenkins 正常继续 运行ning 更多脚本。

  2. 在构建服务器中,当 Java 正在运行时,如果我 运行:

jstack [java pid]

然后我得到以下信息:

Attaching to process ID 25262, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.111-b01
Deadlock Detection:

java.lang.RuntimeException: Unable to deduce type of thread from address 0x00007fc5c8032800 (expected type JavaThread, CompilerThread, ServiceThread, JvmtiAgentThread, or SurrogateLockerThread)

结论:当 Eclipse 运行 处于无头模式时,Java 似乎确实陷入了死锁。它不会一直发生,但我猜是 99%。此外,它不会永远挂起,它会在一两个小时后恢复,这对任何构建服务器来说都是不利的。

那么,有人遇到过这样的问题吗?

(已在评论中确认)

您面临的问题可能是 CDT 索引器中的锁定。有时,当 Eclipse 中的生命周期很短时,CDT 索引器不幸被锁定。在命令行中,您可以使用 -no-indexer 命令行选项(在 Eclipse Mars 中添加)禁用它。

锁定本身已作为错误归档,参见 Bug 327126 - Deadlock attempting to cancel PDOMIndexerJob during a resource delta notification

您的 jstack 问题很可能是无关的,很可能是由于 java 进程和 jstack 进程之间的权限、用户或 JVM 不匹配。