在開發中,新手程序員在查找錯誤時,?這時老程序員就會溫馨提示,可以用斷點調試,一步一步的看源碼執行的過程,從而發現錯誤所在。
重要提示: 斷點調試過程是運行狀態,是以對象的運行類型來執行的
斷點調試介紹
????????斷點調試是指在程序的某一行設置一個斷點,調試時,程序運行到這一行就會停住,然后你可以一步一步往下調試,調試過程中可以看各個變量當前的值,出錯的話,調試到出錯的代碼行即顯示錯誤,停下。進行分析從而找到這個Bug斷點調試是程序員必須掌握的技能。斷點調試也能幫助我們查看java底層源代碼的執行過程,提高程序員的Java水平。
基本概念
- 斷點(Breakpoint):在代碼中設置的特定位置,當程序運行到該位置時,會暫停執行,以便開發者檢查程序的狀態。
- 調試會話(Debug Session):啟動調試模式后,程序在 IDEA 的控制下運行,開發者可以通過各種調試工具與程序交互,這個過程稱為調試會話。
- 調試工具窗口:IDEA 提供了專門的調試工具窗口,用于顯示調試相關的信息,如變量的值、調用棧、線程信息等。
操作步驟
- 設置斷點:在 IDEA 的代碼編輯器中,單擊要設置斷點的代碼行左側的空白區域,會出現一個紅點,表示斷點已設置。也可以通過右鍵單擊代碼行,選擇 “Toggle Breakpoint” 來設置或取消斷點。
- 啟動調試:可以通過以下幾種方式啟動調試會話。
- 點擊 IDEA 工具欄中的 “Debug” 按鈕,選擇要調試的 Java 類或啟動配置。
- 使用快捷鍵,如在 Windows/Linux 系統中通常是 “Shift+F9”,在 Mac 系統中是 “Control+Shift+F9”。
- 在 “Run” 菜單中選擇 “Debug”,然后選擇相應的啟動配置。
- 調試工具窗口:啟動調試后,IDEA 會顯示調試工具窗口,主要包括以下幾個部分。
- Variables(變量):顯示當前作用域內的變量及其值。可以通過雙擊變量來修改其值,方便進行測試和調試。
- Call Stack(調用棧):顯示方法的調用順序,從當前執行的方法開始,向上追溯到方法的調用源頭。可以點擊調用棧中的方法,查看該方法調用時的上下文信息。
- Threads(線程):顯示當前正在運行的線程信息,包括線程的名稱、狀態等。可以在多線程程序中,方便地切換到不同的線程進行調試。
- 調試操作
- Step Over(單步跳過):快捷鍵是 “F8”。程序會執行下一行代碼,如果下一行代碼是方法調用,會直接執行完該方法并返回,不會進入方法內部。
- Step Into(單步進入):快捷鍵一般是 “F7”。如果下一行代碼是方法調用,會進入方法內部,繼續單步執行。
- Force Step Into(強制單步進入):可以強制進入任何方法,包括 Java 核心類庫中的方法,而不僅僅是用戶自定義的方法。
- Step Out(單步跳出):當進入一個方法內部后,使用 “Step Out”(快捷鍵通常是 “Shift+F8”)可以執行完當前方法,并返回到調用該方法的位置。
- Resume Program(恢復程序):快捷鍵是 “F9”。程序會從當前斷點繼續執行,直到遇到下一個斷點或程序結束。
- Evaluate Expression(計算表達式):在調試過程中,可以通過 “Evaluate Expression” 功能計算表達式的值。在 “Variables” 窗口或代碼編輯器中右鍵單擊,選擇 “Evaluate Expression”,輸入要計算的表達式,IDEA 會顯示計算結果。
- Step Over(單步跳過):快捷鍵是 “F8”。程序會執行下一行代碼,如果下一行代碼是方法調用,會直接執行完該方法并返回,不會進入方法內部。
實際開發斷點技巧
- 條件斷點:可以為斷點設置條件,只有當條件滿足時,程序才會在該斷點處暫停。在斷點上右鍵單擊,在“Condition”的內容框中設置條件表達式。
例如,我們在這個for循環中斷點,那么每次執行循環都會進入斷點,我們可以通過設置斷點條件來控制是否進入斷點,比如只需要在 i = 10 的時候進入斷點,則可以在斷點處右鍵,在彈出的對話框的 Condition 中輸入條件,如下所示
for (int i = 0; i < 100; i++) {System.out.println(i);
}
- 異常斷點:IDEA 允許設置異常斷點,當程序拋出特定類型的異常時,會自動暫停在拋出異常的位置。在 “Debug” 窗口中,點擊 “View Breakpoints” 按鈕,選擇 “Java Exception Breakpoints”,可以添加要監控的異常類型。
- 多線程調試:在多線程程序中,可以通過 “Threads” 窗口方便地切換線程進行調試。還可以使用 “Suspend All” 和 “Suspend Thread” 按鈕來暫停所有線程或單個線程,以便分析線程之間的交互和數據共享問題。
如果我們希望按照 線程1-1,線程2-1,線程1-2,線程2-2,線程1-3,線程2-3 的順序輸出,可以通過設置斷點執行順序來實現,具體操作如下所示。
new Thread(()->{System.out.println("線程1-1");System.out.println("線程1-2");System.out.println("線程1-3");
}).start();new Thread(()->{System.out.println("線程2-1");System.out.println("線程2-2");System.out.println("線程2-3");
}).start();
先在兩個線程代碼中打斷點,然后在斷點處右鍵,設置為 Thread,如下圖所示
然后就可以在frame下切換線程執行了。
