簡體   English   中英

如何在Java中調試無法解釋的線程中斷

[英]How to debug unexplained thread interruption in Java

我從Jenkins獲得了InterruptedException ,這是堆棧跟蹤的相關部分:

java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at hudson.remoting.Request.call(Request.java:127)
    at hudson.remoting.Channel.call(Channel.java:646)
    at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:158)
    at $Proxy33.join(Unknown Source)
    at hudson.Launcher$RemoteLauncher$ProcImpl.join(Launcher.java:861)

那個中斷是出乎意料的,到目前為止還無法解釋。 我實際上無法在調試器下實現這一點,它只發生在生產使用的CI中,而且很少發生,在Jenkins作業執行的1%以下。 到目前為止,梳理各種日志並沒有產生任何有用的暗示。 遠程Jenkins節點當時似乎沒有斷開連接。

問題:如何使用上述約束找出InterruptedException或其他任何可能有用的原因?

我們也歡迎任何其他追蹤此類例外原因的想法! 也許Jenkins / Hudson特有的東西, 這個早期問題沒有涵蓋(答案在這里並沒有真正幫助)。

InterruptedException看起來很正常。 檢查Jenkins源代碼我看到它被處理(它們關閉catch塊中的資源)然后重新拋出。 開箱即用,我不明白為什么他們這樣做(首先等待)。

在等待之前查看評論:

// I don't know exactly when this can happen, as pendingCalls are cleaned up by Channel,
// but in production I've observed that in rare occasion it can block forever, even after a channel
// is gone. So be defensive against that.
wait(30*1000);

我會說有人加入等待克服“永遠阻擋的罕見場合”,並同時通過等待中斷引入死亡。

您最好的選擇是檢查Jenkins問題跟蹤器並提交一份報告,告知您的作業失敗,因為等待會不時被中斷並取消遠程調用。 我認為如果他們想花費那么多時間等待或者繼續但是在那一點上沒有失敗,他們應該回去等待。

不幸的是,它沒有得到很好的強調,但等待條件的最佳方法是編寫代碼:

while(condition <> true){

 try { wait(1000L); //do something } catch (InterrruptedException e) { } 

}

你必須注意虛假的中斷,並圍繞這些中斷編碼。

暫無
暫無

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

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