簡體   English   中英

使用Eclipse CDT無頭構建的Java死鎖

[英]Java deadlock with Eclipse CDT headless build

我的情況與此類似: Eclipse CDT Headless構建在構建完成后掛起 ,但我稍微挖了一下並發現了其他問題。

場景 :我在Linux上有一個C ++應用程序和一個Jenkins構建服務器(Debian Jessie 8.2)。 我在開發環境中安裝了Eclipse CDT,它完美地構建了我的C ++應用程序(本地構建)。 我在構建服務器上安裝了Eclipse CDT,我的Jenkins腳本運行headlessbuild來構建我的App。

問題 :即使在構建完成后,Jenkins也會掛起。 但那不是詹金斯的錯。 我從等式中刪除了Jenkins並在構建服務器中執行了Eclipse headlessbuild,結果是相同的,它在打印出“Build Finished”后掛起。 值得注意的是,如果我在構建服務器中打開Eclipse CDT並使用UI觸發構建,我可以成功構建我的應用程序。

版本 :在構建服務器中,我嘗試了Java 1.7和1.8。 至於Eclipse,我嘗試過Kepler,Luna,Mars和Neon(最后一個需要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)

結論 :當Eclipse以無頭模式運行時,Java似乎確實會死鎖。 它不會一直發生,但99%我猜。 此外,它不會永遠停留,它會在一兩個小時后回來,這對任何構建服務器都是不利的。

那么,有沒有人有這樣的問題?

(正如評論中所確認的那樣)

您遇到的問題可能是CDT索引器的鎖定。 有時,當Eclipse中的生命周期很短時,CDT索引器很可能會鎖定。 在命令行,您可以使用-no-indexer命令行選項(在Eclipse Mars中添加)禁用它。

鎖定本身作為錯誤提交,請參閱錯誤327126 - 死鎖嘗試在資源增量通知期間取消PDOMIndexerJob

您的jstack問題很可能是無關的,可能是由於java進程和jstack進程之間的權限,用戶或JVM不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM