Java死锁与Eclipse CDT无头版本

问题描述:

我的情况类似于这个: Eclipse CDT Headless build hangs after build is finished,但我挖了一点点,并发现其他问题。Java死锁与Eclipse CDT无头版本

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

问题:Jenkins即使在构建完成后也会挂起。但这不是詹金斯的错。我从等式中删除了Jenkins,并在构建服务器中执行了Eclipse headlessbuild,结果相同,打印出“Build Finished”后挂起。值得注意的是,如果我在构建服务器中打开Eclipse CDT并使用UI触发构建,则可以成功构建应用程序。

版本:在构建服务器中,我尝试了Java 1.7和1.8。至于Eclipse,我尝试过开普勒,月神,火星和霓虹灯(最后一个需要Java 1.8)。对于这篇文章中,我使用这个:

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继续正常运行 更多脚本。

  2. 在构建服务器,而Java是janging,如果我跑:

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) 

结论:它看起来好像是Java是dea Eclipse在无头模式下运行时会崩溃。它不会一直发生,但我猜是99%。此外,它不会永久悬挂,它会在一两个小时后回来,这对任何构建服务器都是不利的。

那么,有没有人有这样的问题?

+1

很奇怪,它挂着,jstack什么也没有显示。有一种情况我可以看到,如果jstack正在以不同于java进程的用户身份运行,那么得到的错误消息是:https://bugzilla.redhat.com/show_bug.cgi?id=1095504 –

+2

其他要尝试的东西。 1)'--launcher.suppressErrors',以便eclipse不会尝试在错误出口创建UI 2)添加'-no-indexer',因为有时索引器会死锁(需要Mars?或更新版本)。 –

+0

@JonahGraham,你建议的'-no-indexer'选项到目前为止(在火星上)工作得非常好,可以节省生命。我已经尝试过launcher.suppressErrors并且没有冒烟,但是索引器的东西很摇滚。请继续回答这个帖子,以便我可以标记为已解决。非常感谢。 –

(如评论确认)

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

锁止本身提起的错误,见Bug 327126 - Deadlock attempting to cancel PDOMIndexerJob during a resource delta notification

你jstack问题是最有可能无关,并有可能因权限,用户,或者java程序和jstack过程之间的JVM不匹配。