1. 各功能结构图
简单说一下,部分内容
3. Debug 窗口:访问请求到达第一个断点后,会自动激活Debug窗口;
4. 调试按钮:一共有8个按钮,调试的主要功能就对应着这几个按钮,鼠标悬停在按钮上可以查看对应的快捷键
5. 服务按钮:可以在这里关闭/启动服务,设置断点等。
6. 方法调用栈:这里显示了该线程调试所经过的所有方法,勾选右上角的[Show All Frames]按钮,就不会显示其他类库的方法了,否则这里会有一大堆的方法。
7. Variables:在变量区可以查看当前断点之前的当前方法内的变量。
8. Watches: 查看变量,可以将Variables区中的变量拖到Watches中查看;
2.基本用法&快捷键
Debug调试的功能主要对应着是图一中4和5两组按钮:
第一组按钮
有7个按钮
- Step Over(F8): 一行一行地往下走,如果这一行有方法不会进入方法。
- Step Into (F7): 如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法;如HashMap的put()
- (Alt + Shift + F7):强行步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。
- Shift + F8: 步出,从步入的方法内退出到方法调用处,此时,方法已执行完毕,只是还没有完成赋值。
- Drop Frame : 回退断点,后面章节详细说明。
- (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
- Alt + F8 :计算表达式,后面章节详细说明
**第二组按钮 **
共七个按钮,从上到下依次如下:
第一个:Ctrl + F5 更新程序
第二个: F9 恢复程序,比如说:你在第20行和第25行有两个断点,当前运行至20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了。
第三个:Pause Program 暂停程序,启动Debug,感觉用处不大
第四个:Stop xxx 关闭程序
第五个:Ctrl + Shift + F8 查看所有断点
第六个:哑的断点,选择这个后,所有的断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,则该断点失效。
热部署插件,如JRebel,这样就不用每次修改代码后还要去重新启动服务器
3.变量查看
1. 在IDEA中,参数所在行后面会显示当前变量的值
2.光标悬停到参数上,显示当前变量信息
3.点击+,就可以查看到当前变量的详细信息
4. 计算表达式
点击这个按钮;
这个按钮不仅可以是一般变量或参数,也可以是方法,当你的一行代码中调用了几个方法时,就可以通过这种方法查看某个方法的返回值;
这是我的一个测试类
我调用sum(100)时,这边显示求和结果为110;符合预期;
同时,可以设置变量,在计算表达式的框里,可以改变变量的值看,这样有时候就能很方便我们去调试各种值的情况了;不需要sout输出了;
如上图,就是把num 从100改成了200;
5.智能步入
如果,一行代码中有好几个方法,怎么只选择某一个方法进入。之前提到过使用Step Into 或者 Force Step Into进入到方法内部,但这两个操作会根据方法调用顺序依次进入,这比较麻烦。
那么智能步入就很方便了,智能步入,选好断点行,然后调试
想进那个方法进那个方法
6.断点条件设置
通过设置断点条件,在满足条件时,才停在断点处,否则直接运行。
通常,当我们在遍历一个比较大的集合或者数组时,在循环内设置一个断点,如果我们一个一个去看变量的值,那肯定很累,说不定你还错过这个值得重新再来一次。
1. 在断点上右键直接设置当前断点的条件,我设置值为3的时候停止;
这时候,等到nums[i] == 3时,才会停止;
7.多线程调试
由于IDEA在Debug时,默认阻塞级别是ALL,会阻塞其他线程,只有在当前调试线程走完时,才会走其他线程。可以在View Breakpoints里选择Thread,将其设置为默认选项;
点击Make Default设置为默认选项;
这个时候,就可以切换当前线程,如下我这里有两个Debug的线程,切换另一个则进入另一个Debug的线程;
8.回退断点
在调试的时候,想要重新走一下流程,而不用再次发送一个请求?
所谓的回退断点,其实就是回退到上一个方法调用的开始处;在IDEA里测试无法一行一行地回退会回到上一个断点处,而是回到上一个方法。
回退按钮 (Drop Frame)
测试:
在19行进行回退,会回退到14行;method()方法上;
在33行回退,会回退到19行
但是,有一点需要注意,断点回退只能重新走一下流程,之前,某些参数改变了的话,是无法回退到之前的状态的,如对象、集合、更新了的数据库等等。