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

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

Eclipse调试(1)——基础篇的更多相关文章

  1. 《gdb调试之基础篇》

    <gdb调试之基础篇> http://blog.csdn.net/miss_acha/article/details/42346543

  2. [转]Eclipse插件开发之基础篇(3) 插件的测试与调试

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/17/eclipse_plugin_1_1_2.html 1. 使用JUnit对插件进行测试 E ...

  3. 关于Eclipse使用Git基础篇

    一:Git的下载与安装与基本使用 1.打开eclipse->help->Eclipse Markplace->search->fiind输入Egit 你会看到如下截图(我的为已 ...

  4. [转]Eclipse插件开发之基础篇(1) 插件开发的基础知识

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/13/eclipse_plugin_1_0_2.html 名词翻译 有一些名词在翻译的过程中可能 ...

  5. Eclipse插件开发之基础篇(4) OSGi框架

    转载出处:http://www.cnblogs.com/liuzhuo. 1. 什么是OSGi框架 OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环 ...

  6. [转]Eclipse插件开发之基础篇(6) SWT简介

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/09/01/eclipse_plugin_1_3_1.html SWT(Standard Widget ...

  7. [转]Eclipse插件开发之基础篇(5) 制作OSGi Bundle

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/18/eclipse_plugin_1_2_2.html 1. 生成OSGi工程 首先打开新工程 ...

  8. [转]Eclipse插件开发之基础篇(4) OSGi框架

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/18/eclipse_plugin_1_2_1.html 1. 什么是OSGi框架 OSGi(O ...

  9. [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/15/eclipse_plugin_1_1_1.html 在Eclipse中使用PDE(Plug ...

随机推荐

  1. Swagger+Asp.net WebApi实例

    第一步新建WebApi项目 文件-新建-项目,弹出以下页面 第二步,新建参数项目 第三步 1.自定义输入参数 2.定义公用输出参数 3.定义输出参数 4.定义返回模型 第四步,在webapi项目中新增 ...

  2. [LeetCode] Valid Palindrome II 验证回文字符串之二

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  3. [LeetCode] 4 Keys Keyboard 四键的键盘

    Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on screen. Ke ...

  4. 一个web程序员的年终总结

    2017年年终总结(就是一个程序员的瞎叨叨): 从来到中科院到现在,很开心可以在这留下来.毕竟对于我来说,这里符合我对自己毕业后前两年的规划.我是一个很慢的人,特别是对于我想做好的事情,我会非常认真仔 ...

  5. Mysql单表查询(胖胖老师)

    数据准备drop table if exists class;create table class(    class_no int(2) unsigned zerofill primary key ...

  6. [HAOI 2012]音量调节

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  7. Evensgn 捡树枝

    问题 A: Evensgn 剪树枝 时间限制: 1 Sec  内存限制: 128 MB 题目描述 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 E ...

  8. [Wc2010]重建计划

    Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...

  9. 洛谷P3980:[NOI2008]志愿者招募

    线性规划: #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring&g ...

  10. UVA - 11235:Frequent values

    非常优美的RMQ问题,可以运到桶的思想 #include<cstdio> #include<cstdlib> #include<algorithm> #includ ...