♥基础Debug操作:
♥方法断点(菱形):在方法名那一行,会在方法的入口与出口处停留,当然,我们可以点击断点进行配置。
常用场景:当我们不知道接口的实现类是哪一个时,我们可以通过方法断点来确定,不用上下分析,可以提高我们的效率。
♥行断点:圆形。
断点条件:我们先打一个行断点,右键之后出现了condition,我们可以在其中添加条件,当符合该条件时,才会暂停到此处。
♥异常断点:在发生相应异常的地方暂停
常用场景:程序抛出了异常,想快速定位是哪里出现了异常。
缺点:异常可能会太多
我们可以在这里进行声明,出现异常时会自动定位。
♥降帧(Drop Frame)返回到方法调用之前
常用场景:方法执行完想再执行一次,之前可能有些地方出现了遗漏。
♥强制返回:用于结束当前流程,直接返回
常用·场景:避免后续资源操作(数据库、缓存等)
例如当程序执行到某一行时,我们发现了错误,要结束当前流程,避免将错误的信息写入数据库中,此时我们直接使用stop是无法完成的,因为它停止的是debug的流程。那么此时我们就可以使用强制返回(force return)。在方法的栈帧中,右键即可发现force return。
♥执行表达式:高效调试神器,用于执行一段我们实时写的代码
常用场景:查看、修改数据
*Evaluate Expression+Remote Debug=远程调试神器
有时候有的分支我们很难访问到,可能age经常是大于18的,我们可以修改数据,来进入到这个不经常被访问到的分支,然后调试,将测试覆盖的更加全面一点,尽量照顾到每个场景。
♥多线程调试
常用场景:多线程场景下,可以跟踪每个线程的执行过程
All:暂停全部线程,只debug第一个暂停线程
我们可以看到,图中有三个线程。main线程和线程2都没有被执行。
我们继续选择All,当我们给三个线程都打上断点后、然后step over,我们发现
main线程也被执行了,说明我们第一个线程后的断点是失效的,后面的还是会执行,所以选择All,只会debug第一个线程。其他两个线程的运行是无法预测的。但我们选择Thread,并给三个线程全部打上断点,他们都会被断点停住,我们便可以选择调试任意一个线程,按我们想debug的顺序来。
Thread:暂停进入断点的线程,不影响其他线程执行,所有线程依次debug
我们可以看到,除了线程1,其他都被执行了。