2017-06-30 98 views
2

我的情況類似於這個: 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並且沒有冒煙,但是索引器的東西很搖滾。請繼續回答這個帖子,以便我可以標記爲已解決。非常感謝。 –

回答

3

(如評論確認)

你所面臨的問題可能是一個鎖定在CDT索引。有時候,當Eclipse中的生命週期很短時,CDT索引器不幸鎖定。在命令行中,您可以使用-no-indexer命令行選項(在Eclipse Mars中添加)來禁用它。

鎖止本身提起的錯誤,見Bug 327126 - Deadlock attempting to cancel PDOMIndexerJob during a resource delta notification

你jstack問題是最有可能無關,並有可能因權限,用戶,或者java程序和jstack過程之間的JVM不匹配。