作为使用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方法第一行处后,创建的线程依然存在。