Eclipse调试(1)——基础篇

时间:2023-03-08 20:39:50

作为使用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视图如下图所示:

Eclipse调试(1)——基础篇

视图中的信息如下图所示:

Eclipse调试(1)——基础篇

  • “Stack frame instance”:因为Java的内存模型是基于栈的,所以对于Java来说,每执行一个方法就是新建了一个栈结构(Stack frame instance)。
  • 从上面的视图中,还能够清晰的看到程序的调用层次:main方法中调用firstLayer方法;firstLayer中调用secondLayer方法。
  • 该测试程序中运行了两个线程:主线程main;和Thread-0线程。

F5/6/7/8

Eclipse调试(1)——基础篇

  • 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

官方解释:

Eclipse调试(1)——基础篇

Eclipse调试(1)——基础篇

Drop To Frame命令用来将程序退回到指定的栈结构的栈顶。通俗一点说:该命令可以将程序退回到之前执行过的每一个方法的开始处。如下图红框中所示。当前的断点在secondLayer处,如果此时点击Drop To Frame命令,则程序退回到secondLayer方法的第一行;如果先选中firstLayer所在的Stack Frame,然后点击Drop To Frame命令,则程序会直接退回到firstLayer方法的第一行。这就相当于可以回退程序,重复执行你关心的部分。

Eclipse调试(1)——基础篇

正如官方文档中所说,该功能有一定的限制:

  • 不能回退到最顶端的一个Stack Frame.(在本例中为main)
  • 虽然回退了程序,但是像static类型这样的全局数据内容不会被回退。
  • 本例中我在SecondLayer方法中创建了一个新的线程,在执行Drop To Frame回退到firstLayer方法第一行处后,创建的线程依然存在。

Eclipse调试(2)——各种类型断点设置