1. 程式人生 > >Eclipse除錯(1)——基礎篇

Eclipse除錯(1)——基礎篇

作為使用Eclipse的程式設計師都會使用它的Debug。但是有不少人只會用F6、F8,其他功能知之甚少。今天我就來總結一下我在使用eclipse的debug時的一些個人經驗。水平有限,不足之處還請賜教。

測試程式碼

學東西能夠學以致用才是關鍵。所以我使用示例程式碼的形式講解每一個點。在下面的程式碼中,我打了兩個斷點(程式碼中註釋位置)

public class DebugTest {

    public static String firstCall() {
        System.out.println("firstCall...");
        return
"first"; } public static String secodeCall() { System.out.println("secondCall"); return "second"; } public static void firstLayer() { System.out.println("firstLayer"); secondLayer(); System.out.println("firstLayer......"); } public static
void secondLayer() { System.out.println("secondLayer"); Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("thread........");//斷點2 System.out.println("end........"); } }); t1.start(); System.out
.println("secondLayer.........."); } public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append(firstCall()).append(secodeCall());//斷點1 System.out.println("********************************"); firstLayer(); } }

Debug view

以Debug方式執行程式,如果遇到斷點則進入Debug view。Debug檢視如下圖所示:

這裡寫圖片描述
檢視中的資訊如下圖所示:
這裡寫圖片描述

  • “Stack frame instance”:因為Java的記憶體模型是基於棧的,所以對於Java來說,每執行一個方法就是新建了一個棧結構(Stack frame instance)。
  • 從上面的檢視中,還能夠清晰的看到程式的呼叫層次:main方法中呼叫firstLayer方法;firstLayer中呼叫secondLayer方法。
  • 該測試程式中運行了兩個執行緒:主執行緒main;和Thread-0執行緒。

F5/6/7/8

這裡寫圖片描述

  • F6:(Step Over)單步執行每一行程式;
  • F8:(Resume)繼續執行該程式直到下一個斷點或程式結束;
  • F5: (Step Into)跳入一個方法內部;
  • F7:(Step Return)從當前方法內部跳出;

F6/8不用解釋;F5/7需要說明一下的是:當一行中有多個方法時,第一次按F5,跳入第一個方法中,然後按F7從該方法中跳出。再按F5則跳入第二個方法,再按F7則從該方法中跳出。以此類推。方法的跳入跳出順序是按照方法在該行的執行順序來說的。如測試程式中的斷點1處,有四個方法,分別是兩個append方法、firstCall方法和secondCall方法。按F5和F7依次進入和跳出的順序為firstCall–>append–>secondCall–>append.

Drop To Frame

官方解釋:
這裡寫圖片描述

這裡寫圖片描述

Drop To Frame命令用來將程式退回到指定的棧結構的棧頂。通俗一點說:該命令可以將程式退回到之前執行過的每一個方法的開始處。如下圖紅框中所示。當前的斷點在secondLayer處,如果此時點選Drop To Frame命令,則程式退回到secondLayer方法的第一行;如果先選中firstLayer所在的Stack Frame,然後點選Drop To Frame命令,則程式會直接退回到firstLayer方法的第一行。這就相當於可以回退程式,重複執行你關心的部分。

這裡寫圖片描述

正如官方文件中所說,該功能有一定的限制:

  • 不能回退到最頂端的一個Stack Frame.(在本例中為main)
  • 雖然回退了程式,但是像static型別這樣的全域性資料內容不會被回退。
  • 本例中我在SecondLayer方法中建立了一個新的執行緒,在執行Drop To Frame回退到firstLayer方法第一行處後,建立的執行緒依然存在。