关于 c :Java 死锁与 Eclipse CDT 无头构建

Java deadlock with Eclipse CDT headless build

我的情况与此类似:
构建完成后,Eclipse CDT Headless 构建挂起,但我深入研究了一下,发现了其他问题。

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

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

版本:在构建服务器中,我尝试了 Java 1.7 和 1.8。至于 Eclipse,我尝试了 Kepler、Luna、Mars 和 Neon(最后一个需要 Java 1.8)。对于这篇文章,我使用这个:

1
2
3
4
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 命令:

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

观察:

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

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

  • jstack

    然后我得到以下信息:

    1
    2
    3
    4
    5
    6
    7
    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%。此外,它不会永远挂起,它会在一两个小时后恢复,这对任何构建服务器都是不利的。

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

    相关讨论

    • 很奇怪,它挂起并且 jstack 什么也没显示。我可以看到您收到该错误消息的一种情况是,如果 jstack 以与 java 进程不同的用户身份运行:bugzilla.redhat.com/show_bug.cgi?id=1095504
    • 其他要尝试的事情。 1) --launcher.suppressErrors 以便 Eclipse 不会尝试在错误退出时创建 UI 2) 添加 -no-indexer 因为有时索引器会死锁(需要 Mars?或更新版本)。
    • @JonahGraham,您建议的 -no-indexer 选项到目前为止(在火星上)运行良好,可以挽救生命。我已经尝试了 launcher.suppressErrors 并且没有冒烟,但是索引器的东西很糟糕。请继续并回答此帖子,以便我标记为已解决。非常感谢。
    • @GeroldBroser,谢谢。
    • 别客气。但是,尽管我很欣赏您的礼貌,但您通常不必为此感谢。如果您提出问题,您可以通过支持 Qs 和 As 并接受答案来表达您的感谢。请参阅为什么投票很重要?更多。

    (正如评论中所确认的)

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

    锁定本身是作为错误提交的,请参阅错误 327126 - 在资源增量通知期间尝试取消 PDOMIndexerJob 的死锁

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


    以上是关于 c :Java 死锁与 Eclipse CDT 无头构建的全部内容。
    THE END
    分享
    二维码
    < <上一篇
    下一篇>>