【Java】带你走进Debug的世界
關于Debug和本文
Debug,意為“調試”,是程序員必備技能之一。
Debug開始用的時候還是很不習慣的,需要適應,本文面向新手介紹Debug相關內容。
Debug的三種手段
- 斷點(breakpoint)
- 打上斷點以后,程序運行到斷點處就會暫停,可以一步一步觀察運行情況。
- 跟蹤(trace)
- 跟著流程一步一步走,看看程序代碼的執行流程。
- 跟著流程一步一步走,看看變量動態的變化情況。
- 監視(watch)
- 即時監視:鼠標指向變量。
- 快速監視:點右鍵,Inspector。
- 添加監視:點右鍵,Watch。
IntelliJ IDEA
最簡單的程序
先隨著一個最簡單的程序看IDEA的Debug流程。
我們選擇一個1+2+…+10的程序,我們通過這個最基本的程序了解如何去Debug。
IDEA我個人比較喜歡用F8來逐行運行觀察,發現問題再追蹤。
在標注行數的左邊欄的空白處,點一下,會出現一個紅點,帶出一條紅線,這叫斷點(IDEA的斷點真的比Eclipse好看和便于增刪)。
打斷點的目的是使程序Debug運行到這里的時候會停住,我們能逐步地觀察變量的變化、程序語句執行的流程等等。
根據我的觀察,其實對于初學者,需要測試的部分中一個方法打一個斷點就夠了,因為一直按F8就會繼續逐行執行,希望我這么說會比較容易接受一些。
右鍵Debug運行,注意不要Run,Run的話斷點就無效了。
開始運行后,可以看出程序停在了打斷點的那一行處,并且有很多灰色的k-v對,下方的Variable欄就會出現各種變量的值,可以追蹤各個變量的當前值和值的變化。
按F8就可以繼續執行。
Variable欄中藍色的變量表示剛剛被修改過:
運行結束,得到結果:(事實上如果真有Bug,能發現的話在過程中就發現了)
不斷的輸入
我們可能需要命令行輸入很多數據,有時候我們選擇復制后一股腦輸入Debug的Console中,但很多時候我們輸入幾個值并按回車就自動進入了Debug。而Debug運行到需要IO的地方就會阻塞,那么怎么去增加新的輸入呢?
先輸入10,然后回車:
程序跳到上面講過的Debug界面:
順著執行,會被IO卡住,那怎么辦呢?點擊Console,切到Console界面:
輸入新的值,回車:
這次就不是自動切回去了,需要點擊下方的Debugger:
程序繼續執行:
Console識別在一次IO后就切Debugger,所以比較省事的做法是,第一次就把所有的數據輸進去。
中斷Debug
想中斷Debug就和中斷Run一樣,左邊欄的紅色方框,點一下就能結束。
多方法打斷點
下面的代碼除了main()外還有一個多行的方法被調用,如果我們在for那里打上斷點能不能進入function()呢?
public class PlusTest {private static int function(int num) {int sum = 0;for (int i = 1; i <= num; i++) {sum += i;}return sum;}public static void main(String[] args) {int sum = 0;int num = 10;for (int i = 1; i <= num; i++) {sum += function(i);}System.out.println(sum);}}從這個時候開始觀測(只有這一個斷點):
下一步:
下一步:
我們發現,并沒進入function(),這怎么辦呢?
當然是把function()也打上斷點:
接著走下去:
下一步:
哇偶,進去了!我們可以在function()方法里繼續觀察變量的變化了。
遞歸函數的Debug
遞歸的話有明顯的回溯感,特別是對于二叉樹遞歸算法,要是打斷點會感覺一會兒前進一會兒回溯。
要把握清楚到底在哪個子過程中遞歸,看準變量的變化。
這里也不拿很復雜的遞歸函數說事了,就說說階乘遞歸函數吧:
public class PlusTest {private static int function(int num) {if (num == 0 || num == 1) {return 1;}return num * function(num-1);}public static void main(String[] args) {int num = 10;System.out.println(function(num));}}向下分解問題、遞歸:
遞歸到終止條件了:
到達遞歸終止條件后,就開始一步步彈出棧、形成答案了:
輸出結果:
Eclipse
左邊小圓點是斷點,左鍵單擊可標注:
右鍵選擇Debug運行:
會提示選擇進入Debug的模式,一定要進去,點Switch:
左邊有調用棧的信息,右邊有變量表、斷點表等信息,中間是代碼,下面是Console:
這里提示全部的斷點,不用的時候別忘了取消:
遞歸回溯的時候,左邊調用棧矚目:
按F6就像IDEA的F8一樣啦,一行一行執行;而F5的話還能追溯調用棧找到源碼,甚至可用來閱讀源碼 :
鼠標移到變量上還能直接看變量的值和狀況:
右上角的小Bug圖案,右鍵點擊,選擇Close即可退出Debug樣式、返回普通模式:
Eclipse和NetBeans的Debug比較
| 逐語句執行 | F5 | F7 |
| 逐過程執行 | F6 | F8 |
| 跳出函數 | F7 | Ctrl+F7 |
| 運行到光標處 | Ctrl+R | F4 |
總結
以上是生活随笔為你收集整理的【Java】带你走进Debug的世界的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】伸展树的Java实现
- 下一篇: 【数字逻辑设计】多级组合逻辑电路减少硬件