目录
- 1 Debug简介
- 2 基本用法
- 3 智能步入
- 4 断点条件设置
- 5 手动修改程序中变量的值
- 6 计算表达式
- 7 异常断点
- 8 字段断点(监听这个字段)
- 9 Variables和Watches
- 10 Stream流
1 Debug简介
- 开发中,可以使用Debug来追踪代码的运行流程;
- 如果程序运行中出现异常,启用Debug模式可以定位异常发生的位置、以及在运行过程中参数的变化;
- 也可以启用Debug模式来追踪代码的运行流程去学习第三方框架的源码;
首先看下IDEA中Debug模式下的界面,如下是在IDEA中启动Debug模式,进入断点后的界面:
- 以Debug模式启动服务;
- 断点:在左边行号栏单击左键;
- Debug窗口:访问请求到达第一个断点后,会自动激活Debug窗口;
- 调试按钮:调试的主要功能就对应着这几个按钮,菜单栏Run里可以找到同样的对应的功能;
- 服务按钮:可以在这里关闭/启动服务,设置断点等;
- 方法调用栈:这里显示了该线程调试所经过的所有方法,勾选右上角的[Show All Frames]按钮,就不会显示其它类库的方法了,否则这里会有一大堆的方法;
- Variables:在变量区可以查看当前断点之前的当前方法内的变量;
- Watches:可以做更加复杂的东西,比如可以观察将变量做一些处理后的结果;
2 基本用法
1 第一组按钮
从左到右依次解释:
- Show Execution Point:如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行;
- Step Over:步过,一行一行地往下走,如果这一行上有方法不会进入方法;
- Step Into:步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法;
- Force Step Into:强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法;
- Step Out:步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值;
- Drop Frame:回退断点(新版IDEA的Dubug按钮组中没有Drop Frame 按钮,我们可以用 Reset Frame 来代替;
- Run to Cursor:运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点;
- Evaluate Expression:计算表达式的值。这个表达式不仅可以是一般变量或参数,也可以是方法,当一行代码中调用了几个方法时,就可以通过这种方式查看某个方法的返回值;另外,在表达式的框里,可以改变变量的值,方便地调试各种值下的情况;
2 第二组按钮
从上到下依次解释:
- Rerun ‘xxxx’:重新运行程序,会关闭服务后重新启动程序;
- Modify Run Configuration:修改运行配置;
- Resume Program (F9):恢复程序。如果下面有代码,则跳转到下面的断点;如果下面代码没有断点,那么执行完全部代码;
- Pause Program:暂停程序;
- Stop ‘xxx’ (Ctrl + F2):关闭程序;
- View Breakpoints (Ctrl + Shift + F8):查看所有断点;
- Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled;
实现步入同一行的多个方法中某一个方法,在Run-Debugging Actions下可以找到,Smart Step Into(Shift + F7)。
通过设置断点条件,在满足条件时才停在断点处,否则直接运行。
应用意义:遍历一个比较大的集合,在循环内设置了一个断点,如果一次次点击查看变量会很累而且没有意义。
方法:在断点上右键设置当前断点的条件,例如下图设置i==5
时断点才生效。
在Debug模式中,可以手动修改程序中变量的值,如下所示:i的值应该是0,手动修改为10,继续执行代码,可以看到控制台输出的就是 10,并且立刻跳出循环。
10
计算表达式有两个作用:
- 查看表达式(包括方法)的值;
- 设置表达式的值(相当于“手动修改程序中变量的值”);
在Debug之前,设置异常断点,Debug时如果出现设置包含的异常,断点就会停留在异常出现的地方。
1 在字段上打断点:
2 测试:
3 停在了构造方法上:
“Variables”是用来观察变量的,而“Watches”可以做更加复杂的东西,比如可以观察将变量做一些处理后的结果.
在编辑框内编写list.add("鼠")
,然后回车确认。
[猫, 狗, 鼠]
我们暂停在 Stream 的处理代码行时,可以将 Stream 的整个处理流程以图形化界面的形式展示。