技术文章

Java程序出错怎么去定位错误?

1.概述

在本教程中,我们将研究一些高级IntelliJ调试工具。假定大家已了解调试基础知识(如何开始调试,Step Into,Step Over 操作等)。如果不是,请参考本文以获取更多详细信息。

2.Smart

Step Into

在某些情况下,会在一行源代码上调用多个方法,例如 doJob(getArg1(),getArg2())。如果调用单步执行(F7),则调试器将按照JVM用于评估的顺序进入方法: getArg1 – getArg2 – doJob。

但是,我们可能要跳过所有中间调用,然后直接进入目标方法。聪明的步入行动可以做到这一点。

默认情况下,它绑定到Shift + F7,并且在调用时如下所示:

Java程序出错怎么去定位错误

现在我们可以选择目标方法。另外,请注意,IntelliJ始终将最外面的方法放在列表的顶部。这意味着我们可以通过按Shift + F7 | 输入。

3.Drop Frame

我们可能意识到,我们感兴趣的某些处理已经发生(例如,当前方法参数的计算)。在这种情况下,可以丢弃当前的JVM堆栈框架以对其进行重新处理。

请考虑以下情况:

Java程序出错怎么去定位错误

假设我们有兴趣调试getArg1处理,因此我们删除当前帧(doJob方法):

Java程序出错怎么去定位错误

现在我们处于先前的方法中:

Java程序出错怎么去定位错误

但是,此时调用参数已经计算完毕,因此,我们还需要删除当前帧:

Java程序出错怎么去定位错误

现在,我们可以通过调用Step Into重新运行该处理。

4.当前断点

有时,非私有字段是由其他类修改的,而不是通过setter修改的,而是直接修改的(第三方库就是这种情况,我们不控制源代码)。

在这种情况下,可能很难理解何时进行修改。IntelliJ允许创建字段级断点来跟踪。

它们像往常一样设置–左键单击字段行上的左侧编辑器装订线。之后,可以打开断点属性(在断点标记上单击鼠标右键)并配置我们是否对字段的读取,写入或两者感兴趣:

Java程序出错怎么去定位错误

5.记录断点

有时我们知道应用程序中存在竞争条件,但不知道它到底在哪里。要确定它可能是一个挑战,尤其是在使用新代码时。

我们可以将调试语句添加到程序的源代码中。但是,第三方库没有这种功能。

IDE可以在这里提供帮助- 它允许设置断点,这些断点一旦被击中就不会阻止执行,而是产生日志记录语句。

假设我们有兴趣记录实际的 isInterested 调用的参数。

让我们在目标方法中创建一个非阻塞断点(Shift +左键单击左编辑器装订线)。之后,让我们打开其属性(在断点上单击鼠标右键)并定义要记录的目标表达式:

Java程序出错怎么去定位错误

6.创建标记  

当应用程序在断点处停止并且可以从堆栈帧访问目标时,可以标记对象。选择它,然后按F11(“ 标记对象”操作)并定义目标名称:

Java程序出错怎么去定位错误

7.结论

我们检查了许多在调试多线程应用程序时可以大大提高生产率的技术。这通常是一项艰巨的任务,所以在这里我们不能低估工具帮助的重要性,毕竟不是在写Bug的路上就是在改Bug的路上