Eclipse除錯(1)——基礎篇
阿新 • • 發佈:2019-01-22
作為使用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方法第一行處後,建立的執行緒依然存在。