参考https://blog.csdn.net/u011781521/article/details/55000066
Eclipse的Debug调试技巧大全
====================================================================
Skip All Breakpoints : 将所有断点设置为被跳过的,设置了Skip All Breakpoints之后,所有断点上都会有一个斜线,表示断点将被跳过,线程不会在该断点处被挂起。
====================================================================
Drop to Frame : 这个命令可以让程序回到当前方法的开头第一行重新开始执行,可以重新执行这个java堆栈帧,可以选择一个指定的堆栈帧,然后点击 Drop to Frame,这样就可以重新进入指定的堆栈帧。使用Drop to Frame时候需要注意:
1.不能drop到已经执行过的方法栈中的方法中。
2.drop到stack frame中时,不会改变全局数据原有的值,比如,一个包含元素的vertor并不会被清空。
====================================================================
Step Return : 跳出当前方法,在被调用方法的执行过程中,使用Step Return会在执行完当前方法的全部代码后跳出该方法返回到调用该方法的方法中。
Step Over : 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步。
Step Into:单步执行,遇到子函数就进入并且继续单步执行
====================================================================
Run to Line Ctrl+R -> 执行到当前行(将忽略中间所有断点,执行到当前光标所在行);
====================================================================
3)Variables View (变量视图)
1.为变量名视图,显示当前代码行中所有可以访问的实例变量和局部变量
2.显示所有的变量值
3.可以通过该窗口来改变变量值(右键change value)
====================================================================
Breakpoints View将列出你在当前工作区间里设置的所有断点,双击断点可以进入到程序中该断点的位置。还可以启用或禁用断点,删除,添加新的,根据工作组或点命中计数给他们分组。在使用断点是有以下两个技巧是十分有用的:
Hit Count: 是指定断点处的代码段运行多少次,最典型的就是循环,如果要让一个循环执行10次就线程挂起,则指定Hit Count值为10,那么当前的循环执行到第九次的时候就会挂掉。(需要在debug as前设置好)
Conditional:顾名思义,就是条件判断,例如我们需要循环变量i==10时,线程挂起,则条件设定为i==10,选择Suspend when “true”。
(需要勾选该断点,且必须是判断是,如b==4,直接写4或者b=4会报错或无效。也可以这样写a.getA1()!=3)
如果选择Suspend when value changes,那么可能在Conditional在变量值发生改变的时候就挂起。
@Test
public void t1() {
int b = 0;
for (int i = 0; i < 10; i++) {
b = b + 0;
// b=b+1;
}
上面的代码设置条件b,循环内部设置Suspend when value changes,会在第一次到断点时停下,之后不停;
如果注释掉b = b + 0放开b = b + 1,则每次都停。原因是b被初始化时改了一次值,所以一定会停一次。
但是如果使用下面的代码,
@Test
public void t2() {
A a = new A();
a.a1 = 0;
for (int i = 0; i < 10; i++) {
a.a1 = a.a1 + 0;
//a.a1 = a.a1 + 1;
}
}
class A {
public int a1;
}
会发现条件写成a.a1时情况和上面一样,条件写成a时只会停一次,原因是a被初始化,
之后检测a的地址是否改变,而不是a的属性是否改变。
如果把a的a1设为private属性,并加上get/set方法,检测a.getA1()结果和上面的检测a.a1一模一样
@Test
public void t2() {
A a = new A();
a.setA1(0);
for (int i = 0; i < 10; i++) {
a.setA1(a.getA1() + 0);
// a.setA1(a.getA1() + 1);
}
}
====================================================================
6)Display View
可以使用这个视图,输入或者演算一些新的代码。这些代码在当前的调试位置的上下文环境中被执行,
这意味着,你可以使用所有变量甚至是内容助手。要执行你的代码的话,只需标记它,
并使用右键菜单或者CTRL+U(执行)或者 CTRL+SHIFT+I (检查)
例如在display输入b=b+1并选中后,右键execute或者ctrl+u可以执行此代码,给正在调试的代码的b加1,
达到类似python的console的效果
====================================================================
quick type hierarchy ctrl+t 查看当前类、接口的继承层次,
默认进入时,显示继承/实现了当前类/方法的子类,子接口;
再次ctrl+t,将显示被当前类、接口继承/实现的超类/接口;
调试时,经常用该功能,在接口或抽象类的方法调用处,ctrl+t察看实现类,直接导航到对应的实现方法中。
====================================================================
异常断点:在定位问题的过程中,常常会遇到断点无法打到合适的位置,以至于和问题的触发点千差万别,
所以这个时候不妨试试异常断点,顾名思义,异常断点是指抛出某种异常后自动挂起的断点。
在breakpoint里点击{j!},即add java exception breakpoint,增加一个异常断点
下面的代码添加了nullpointerexception和arrayindexoutofboundexception,在debug时报错自动挂起
添加时用正则匹配添加,如nullpointerexception用null*exception*即可搜索到
@SuppressWarnings("null")
@Test
public void t2() {
A a = null;
System.out.println(a.getA1());
}
@Test
public void t3() {
int[] a = new int[] { 1, 2 };
System.out.println(a[2]);
}