JavaRush /Java Blog /Random-TW /IntelliJ IDEA 和 Debug:不是潛水,而是浮潛
Viacheslav
等級 3

IntelliJ IDEA 和 Debug:不是潛水,而是浮潛

在 Random-TW 群組發布
編寫程式碼就成功了一半。仍需要使其正常工作。IDE 和除錯工具在這方面為我們提供了許多幫助。
IntelliJ IDEA 和調試:不是潛水,而是浮潛 - 1
以 IntelliJ IDEA 為例,我建議熟悉如何了解程式碼運行時會發生什麼情況。調試是一個廣泛的主題,因此本評論不提供像潛水員一樣的深度潛水。但我肯定希望浮潛)

介紹

編寫程式碼的一部分是調試它。如果您的任務包括程式碼支持,那麼將會有更多的調試。好吧,此外,在調試的幫助下,您可以深入檢查所使用的庫和框架的工作,就像您可以將自己沉浸在別人的程式碼叢林中一樣。對於我們的潛水,我們需要: 首先,使用快速啟動原始碼解壓縮下載的存檔。啟動 IntelliJ Idea 並建立「從現有來源建立新專案」。選擇hibernate4子目錄中的pom.xml檔。導入時指定「自動導入Maven專案」並完成專案的創建,其他設定不變。匯入專案時,將下載的 WildFly 應用程式伺服器解壓縮到某個目錄中。我們使用該檔案(或 *nix 系統的standalone.sh)啟動伺服器bin\standalone.bat(!)從 --debug 參數開始很重要 。我們等待伺服器啟動。他們會寫信給我們,告訴我們開始時間並註明時間。它看起來像這樣:
IntelliJ IDEA 和調試:不是潛水,而是浮潛 - 2
接下來,我們需要在伺服器上運行我們選擇的項目。這個過程在專案本身的一個小文檔中進行了描述: \hibernate4\README.adoc 如本文檔所示,我們需要在 hibernate4 目錄中執行命令:mvn clean package wildfly:deploy 我們正在等待建置已成功完成的訊息:
IntelliJ IDEA 和調試:不是潛水,而是浮潛 - 3
之後,在伺服器日誌中我們可以看到新專案是如何「部署」的:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
之後,我們進入該頁面,我們應該顯示一個帶有「會員註冊http://localhost:8080/wildfly-hibernate4」表單的頁面。所以,我們的實驗準備工作已經完成,我們可以開始了))為了清晰起見,前面會有很多圖片,所以做好準備)

遠端偵錯

因此,我們需要配置 Debug 模式,以便我們的 IDE 控制應用程式伺服器上程式碼的執行。IntelliJ Idea 有兩個版本:免費(社群)和付費(終極)。後者可以以EAP的形式正式試用。在 Ultimate 版本中,一切都很簡單 - 應用程式伺服器可以在偵錯模式下直接從 IDE 啟動。但在社群版本中,您需要手動執行一些操作。因此,讓我們考慮一個更複雜的情況,即 社區版本中的設定。社區版本有一些限制。特別是,您無法從中運行應用程式伺服器。但是您可以設定遠端偵錯(遠端偵錯),當單獨的某個地方有一個正在運行的伺服器以及我們需要的應用程式時。讓我們使用此處的設定描述:IntelliJ Idea 社群版中的遠端偵錯 Wildfly(為連接埠 8787 設定遠端運行配置)。配置完成後,我們在調試模式下啟動新配置:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
如果一切順利,我們將在下面看到一條相關訊息:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

調試過程

讓我們調試保存記錄。為此,我們必須先決定我們要探索的地點。從視窗來看,我們需要一個「註冊」按鈕。讓我們在程式碼中找到它。所以,我們需要一個元素,它應該有文字:「Register」。或者她應該與這件事有關。點擊Ctrl+Shift+F並在引號中尋找“註冊”。我們看到index.xhtml上有一個。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
按 Enter 鍵前往找到的來源:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
所以,我們看到註冊時,呼叫了memberController.register , 顯然,這一定是某種java類別。點擊Ctrl+N並搜尋:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
確實有這樣一個類別。讓我們來看看。顯然,應該有一個註冊方法。點選 Ctrl+F12尋找註冊方法
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
確實,我們找到了。顯然,註冊發生在memberRegistration.register中。按住 Ctrl 鍵並按一下該方法即可「落入」其中:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
現在讓我們設定一個「斷點」或斷點。這是一個標記,告訴程式碼執行應該在哪裡暫停。這一刻我們將有機會學到很多有趣的東西。要放置它,您需要單擊行號右側的位置。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
在 http://localhost:8080/wildfly-hibernate4 頁面上填寫欄位並點擊註冊按鈕。面板上的idea圖示會閃爍:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
進入Idea,可以看到調試面板中有很多有趣的資訊:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
在這裡您可以看到物件欄位的值。例如,註冊會員包括哪些內容:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
偉大的。我們還能做什麼?我們可以打開上下文選單並選擇“評估表達式”(或透過選單“運行”->“評估表達式”)。更好的是,在調試器控制面板上:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
這是斷點處的一個超級酷的能力,可以存取該程式碼點有權存取的所有內容,執行可以在該點執行的任何程式碼。例如:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
調試器控制面板上還有一個控制按鈕,負責將程式流程控制移至何處。是不是很神奇?)透過按 F8(Step Out)按鈕,我們可以在不輸入方法的情況下瀏覽程式碼。按 F9,我們停止使用偵錯器遍歷程式碼行,並讓偵錯器控製程式的執行。如果我們按 F7(單步執行),那麼我們將瀏覽程式碼,輸入一路上遇到的每個方法。對了,特別注意這個訊息塊:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
這顯示了我們所在的線程以及當前線程堆疊上的方法。但這還不是全部。為了方便起見,您可以開啟框架標籤。為此,必須啟用它:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
現在,在框架選項卡上,我們可以看到有關從方法到方法的轉換的信息,因為 開始使用 Step Into 遍歷代碼。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
正如我們所看到的,我們不能總是轉移到程式目前正在執行的位置。我們現在位於「getDelegate:469,AbstractEntityManager(org.jboss.as.jpa.container)」。但事實上,我們正​​在執行中。這可以透過以下指定的類別來證明:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
讓我們看看這個。我們知道,它指向當前物件。我們在 TransactionScopedEntityManager。為什麼 Idea 不能向我們展示程式碼?事實上,IntelliJ Idea 目前不知道任何 TransactionScopedEntityManager,因為 它沒有連接到我們的專案(它不在專案依賴項中)。當應用程式伺服器運行時,其中運行著很多很多不同的程式庫。但我們對他們知之甚少,因為… 一般來說,我們不需要深入研究內部結構,我們只需要它能夠運作。但有時工作或運動興趣需要它。然後,您需要告知Idea有關該庫的信息,以便它知道從哪裡獲取類別代碼。

連接第三方程式庫進行調試

首先,我們自己需要了解需要連接的是什麼類型的函式庫。 第一種方法是最困難的——在網路上搜尋。找到結果的速度和結果很大程度取決於專案的管理情況。例如,WildFly 有一個開放的儲存庫。因此,當我們谷歌「TransactionScopedEntityManager」時,我們會造訪https://github.com/wildfly/wildfly/tree/master/jpa/subsystem,並發現我們需要wildfly-jpa。 第二種方法是正確的。伺服器在哪裡,看看那裡。有多種方法可以幫助解決這個問題。例如,在 Windows 上,它可能是Far Manager。以下是搜尋演算法的範例。安裝並啟動它後,使用Tab 鍵切換到其中一個選項卡,使用Alt+F1左側選項卡或Alt+F2右側選項卡,然後選擇我們在硬碟上所需的分割區。安裝後,Far Manager 目錄本身很可能在 Far Manager 中開啟。若要前往磁碟根目錄,請按Ctrl + \。使用時,Alt+F開啟搜尋窗口,開始輸入目錄名稱,找到目錄後按 Enter。這個搜尋很聰明,並突出顯示那些與搜尋文字相符的目錄。如果輸入的字元沒有資料夾,則無法輸入此類字元。這樣我們就進入應用程式伺服器目錄了。假設我們不知道模組位於伺服器上的位置。也許這是您一生中第一次聽說某種野蠅。因此,請立即按一下此處Alt+F7搜尋文件。因此,邏輯表明:我們需要一個包含庫的文件。也就是說,我們需要一個罐子。裡面應該有一個TransactionScopedEntityManager類別。因為 class = file,然後尋找「contains」。也就是說,像這樣:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
現在,讓我們等待結果。他不會讓你久等)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
現在,我們需要在某處找到它的原始碼。並且有 2 個選項: 也許我們可以使用第二個。我們去那裡找一下:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
現在讓我們繼續描述依賴性。在此頁面上您可以下載原始碼。太好了,現在我們已經下載了程式碼。剩下的就是連接庫了。連接起來極為簡單。我們需要打開項目設定:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
在那裡,我們選擇「Libraries」並將收到的原始程式碼新增至「Sources」部分,在「Classes」部分中,我們指示我們使用 Far Manager 找到的 WildFly 目錄中的庫 jar 檔案本身。之後,當我們透過 F7 導覽時,我們將看到 AbstractEntityManager 和 TransactionScopedEntityManager 類別的內容,並且還可以透過使用 Ctrl+N 按類別搜尋來取得。

有條件的斷點

現在讓我們回到斷點。有時候,我們並不總是想停下來,但只是在某些情況下才想停下來。怎麼辦?在這裡我們的 IDE 也會幫助我們。透過放置斷點,我們可以為其指定一個條件。例如,放置一個點並右鍵單擊它:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
現在,只有當名稱為 Maximilian 時,斷點才會觸發。透過點擊「更多」按鈕,您將可以使用一組擴充的斷點設定。

異常斷點

有時我們可能會收到錯誤,我們想追蹤它的來源。然後我們可以不在特定的程式碼行中添加斷點,而是在拋出異常的地方添加斷點。為此,您需要展開所有斷點的清單:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
並為選定的異常類型建立新規則:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
例如,對於 NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

熱插拔類

調試器是一個了不起的東西。除了調試之外,它還允許您更改類別!是的,資源(例如 xhtml 頁面)不能那麼容易更改。但是java類別的程式碼可以即時替換(這稱為熱交換)。為此,只需更改附加了調試器的類別並執行“運行”->“重新加載更改的類別”。關於此主題的有用評論:在 JVM 上熱交換代碼的 4 種免費方法

結論

調試器是一個功能強大的工具,它允許開發人員深入執行程式碼的最深處並研究它的每一個細節。這使您可以糾正最令人困惑的錯誤。它還可以讓您更好地了解某些庫的工作原理。即使這樣一個簡短的評論也令人印象深刻,但我希望它有用且有趣。如果有人對此材料感興趣,您可以使用以下連結繼續深入:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#維亞切斯拉夫
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION