编程语言
首页 > 编程语言> > Java死锁与Eclipse CDT无头构建

Java死锁与Eclipse CDT无头构建

作者:互联网

我的情况与此类似:
Eclipse CDT Headless build hangs after build is finished,但我对此进行了深入研究,发现了其他问题.

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

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

版本:在构建服务器中,我尝试了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/

观察结果:

>当Java挂起时,我可以终止其进程并获取可执行文件
可以用了.当我从jenkins触发构建并杀死它时
死锁的Java进程,Jenkins只是继续正常运行
进一步的脚本.
>在构建服务器中,如果正在运行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不匹配所致.

标签:jenkins,eclipse-cdt,deadlock,java,c-4
来源: https://codeday.me/bug/20191111/2018283.html