簡體   English   中英

Eclipse和其他Java IDE用於調試並發代碼

[英]Eclipse & other Java IDEs for debugging concurrent code

我目前正在研究一些似乎有一些競爭條件的並發代碼。 我正在嘗試使用我當前的IDE Eclipse調試代碼,但我並不完全滿意。 特別是,對於變量存在競爭條件,使得在訪問它的方法之一沒有斷點(“獲取它”),變量設置方法不完成,並且變量被設置為空。 但是,如果我在訪問方法上設置了一個斷點,並按住F8 - 默認的跨越按鈕 - 變量幾乎總是設置為正確的(非空)值。

這讓我想問以下問題:Eclipse是否有可能不會在所有線程上的斷點上暫停執行,以至於我可以看到潛在的競爭條件,因為它看起來沒有斷點,或者是其他東西(可能)發生了什么?

如果Eclipse沒有快速暫停執行,是否有其他適用於Java的IDE /調試器可以更好地完成這項工作? 請注意,我不是在尋找像Java Pathfinder這樣的正式驗證工具 - 我不想檢查競爭條件是否存在,我想在我的調試器中看到它們展開(如果只是因為它可能有趣的話)。

默認情況下,如果一個線程到達斷點,Eclipse將不會掛起其他線程。 但是,您可以在Window > Preferences > Java > Debug > Default suspend policy for new breakpoints => 'Suspend VM'更改此行為。

這讓我想問以下問題:Eclipse是否有可能不會在所有線程上的斷點上暫停執行,以至於我可以看到潛在的競爭條件,因為它看起來沒有斷點,或者是其他東西(可能)發生了什么?

好吧,不僅僅是這樣,而且調試器的出現改變了環境,使得您無法再現在運行程序時獲得的相同情況。 Eclipse會在遇到斷點時暫停某些線程,但是其他沒有遇到斷點的線程可以繼續運行並繼續更改數據。

使用調試器對競爭條件進行故障排除非常困難 - 您不僅要在大海撈針中尋找針,還要調試器改變大海撈針的結構。

您可以更好地理解代碼和處理並發代碼所采取的策略。 例如,您是否使用鎖保護共享狀態? 你是如何/正在同步的? 為了能夠寫入變量foo ,線程必須經歷哪些步驟?

請記住,無法保證一步完成訪問/設置變量。 您可能希望使用原子對象來確定。

並且還記得可以緩存變量值。 要確保它沒有緩存,請使用volatile。

如果忘了,可以設置變量的斷點。 只需單擊變量聲明的左側,就像創建正常斷點一樣。

暫無
暫無

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

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