嗨,大家好,我是一条。 今天在调试一个bug的时候,需要进入到某个值不为空的情况下,一共66条记录,一条就一个一个点下去。正好被旁边的同事看到, “你不知道debug可以设置条件吗” “咦,好像听过,怎么用呀?” …… 今天就和大家聊聊哪些你可能还不知道的debug技巧,为了照顾零基础的朋友,我们从头开始聊。
对于一名程序员来说,衡量其是否优秀,不是看他能写多少代码,而是看他能解决多少问题。
debug主要用来追踪代码的运行流程,从而分析定位异常发生的位置,以及在运行过程中参数的变化。也可以用debug模式来跟踪代码的运行流程去学习三方框架的源码。
说白了就是控制程序一步一步的走,而不是瞬间就跑完。
因为目前主流开发都用idea。所以拿idea举例,主要包括如下内容:
首先以Debug模式启动应用,观察一下界面的变化。 Debug调试的基础功能主要对应着以下三点。

共8个按钮,从左到右依次如下:

共7个按钮,从上到下依次如下:

在Debug过程中,跟踪查看变量的变化是非常必要的,这里就简单说下idea中可以查看变量的几个地方,相信大部分人都了解。

在前面提到的计算表达式,Evaluate Expression (Alt + F8) 。可以使用这个操作在调试过程中计算某个表达式的值,而不用再去打印信息。

按Alt + F8或按钮,或者,你可以选中某个表达式再Alt + F8,弹出计算表达式的窗口
如下,回车或点击Evaluate计算表达式的值。
这个表达式不仅可以是一般变量或参数,也可以是方法,当你的一行代码中调用了几个方法时,就可以通过这种方式查看查看某个方法的返回值。
在计算表达式的框里,可以改变变量的值,这样有时候就能很方便我们去调试各种值的情况了。

想想,一行代码里有好几个方法,怎么只选择某一个方法进入。
之前提到过使用Step Into (Alt + F7) 或者 Force Step Into (Alt + Shift + F7)进入到方法内部,但这两个操作会根据方法调用顺序依次进入,这比较麻烦。
那么智能步入就很方便了,智能步入,这个功能在Run里可以看到,Smart Step Into (Shift + F7)。
按Shift + F7,会自动定位到当前断点行,并列出需要进入的方法,点击方法进入方法内部。

在调试的时候,想要重新走一下流程而不用再次发起一个请求?
首先找到方法调用栈区域,在idea里测试无法一行一行地回退或回到到上一个断点处,而是回到上一个方法。
但有一点需要注意,断点回退只能重新走一下流程,之前的某些参数/数据的状态已经改变了的是无法回退到之前的状态的,如对象、集合、更新了数据库数据等等。
回退的方式有两种。


想要在Debug的时候,中断请求,不要再走剩余的流程了?
有些时候,我们看到传入的参数有误后,不想走后面的流程了,怎么中断这次请求呢(后面的流程要删除数据库数据呢....),难道要关闭服务重新启动程序?嗯,我以前也是这么干的。
确切的说,我也没发现可以直接中断请求的方式(除了关闭服务),但可以通过Force Return,即强制返回来避免后续的流程。

这也是本文的核心部分,包括条件断点和多线程调试。
通过设置断点条件,在满足条件时,才停在断点处,否则直接运行。 通常,当我们在遍历一个比较大的集合或数组时,在循环内设置了一个断点,一个一个去看变量的那肯定很累,说不定还会错过。

点击View Breakpoints (Ctrl + Shift + F8),查看所有断点。
Java Line Breakpoints 显示了所有的断点,在右边勾选Condition,设置断点的条件。
勾选Evaluate and log,可以在执行这行代码是计算表达式的值,并将结果输出到控制

在程序中出现需要拦截的异常时,会自动定位到异常行。
点击+号添加Java Exception Breakpoints,添加异常断点。然后输入需要断点的异常类,之后可以在Java Exception Breakpoints里看到添加的异常断点。
我这里添加了一个NullPointerException异常断点,出现空指针异常后,自动定位在空指针异常行。

一般情况下我们调试的时候是在一个线程中的,一步一步往下走。但有时候你会发现在Debug的时候,想发起另外一个请求都无法进行了? 那是因为IDEA在Debug时默认阻塞级别是ALL,会阻塞其它线程,只有在当前调试线程走完时才会走其它线程。 那如何开启多线程调试呢?
在View Breakpoints里选择Thread,然后点击Make Default设置为默认选项。

在Frames的下拉列表里,可以切换当前的线程。

是不是对debug有了新的认识,有没有学到新的知识呢,欢迎留言交流。 附上去哪儿网内推,欢迎来和一条共事。