IDEA的debug翻译

前言

不论是调试程序,还是了解一个框架,我个人觉得最好的方法就是直接上手debug,而idea强大的debug功能就为我们提供了便利,但是平时我就只会用那么几个step into这些的功能,这篇博文打算花点时间好好了解一下它的debug功能。

基础功能

首先先来看看最基础的界面:

![image-20210201201741120](/Users/chenlangping/Library/Application Support/typora-user-images/image-20210201201741120.png)

红框内就是我们最常用到的功能了,它们分别是:

  • Step Over,步过,F8:不进入到函数里面去
  • Step Into,步入,F7:进入到当前行的方法中去
  • Force Step Into,强制单步进入:进入任何方法,包括类库中的那些方法
  • Step Out,步出,Shift+F8:跳出当前的方法
  • Drop Frame,丢帧:退回到当前断点处
  • Run to Cursor:运行到光标处,基本不使用
  • Evaluate Expression:计算表达式,常用

通常过程

首先我们需要明确的是,没有那种一刀切的方法能够概述所有的debug过程,因为每个程序之间都很不一样,而且每个程序员写出的bug也是不同的,所以针对不同的程序我们所需要做的debug步骤也是不同的。这里只给出一种相对来说较为通用的模型:

  1. 找出程序应该在哪里暂停。通俗来说,也就是找到在哪里打断点(BreakPoint)。断点本质上是一种记号,在这里需要暂停整个程序,并且调试器会介入。
  2. 在debug模式下运行需要被调试的程序。
  3. 然后程序会在指定的位置停下来,就可以使用调试器来进行调试,调试器可以帮助你获取程序当前的信息、线程的状态、变量的信息等等,有了这些信息的帮助,相信你可以很轻松找到对应的bug所在。
  4. 解决掉问题。

简单的实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AverageFinder {
public static void main(String[] args) {
System.out.println("Average finder v0.1");
double avg = findAverage(args);
System.out.println("The average is " + avg);
}

private static double findAverage(String[] input) {
double result = 0;
for (String s : input) {
result += Integer.parseInt(s);
}
return result;
}
}

一段非常简单的计算命令行参数的函数,比如命令行参数如果是1 2 3,那么输出就是6.0,我们就用这个简单的小程序作为例子来进行debug之旅。

1、设置断点

设置断点还是非常容易的,只需要在gutter处点击一下,就会出现小圆红点,证明改行已经被下了断点了。

2、在debug模式运行程序

2020.3.2的idea版本是设置好对应的命令行参数,然后直接点击debug按钮就可以以debug模式运行程序了。

3、分析程序状态

image-20210201204812874

其中高亮的这一行,代表了程序目前正准备运行的这一行(还没有运行),而它的参数args已经准备就绪(用灰色的字体显示)。当然此时下面的debugger面板中也有对应的变量可以观看。

4、使用step功能

直接使用F7进入到方法体内,然后就可以愉快F8了。

Breakpoint断点

断点就是当到达程序的某一行的时候,所标记的点。它可以很简单,当然也可以配合某些条件成立的时候才进行。一旦你的程序设立了断点,那么断点就会一直存在,除非你手动取消。

断点的种类

在idea中,有以下这些断点类型:

  • 行断点Line breakpoints:就是最最常见的那种类型,任何的可执行的代码的行的位置都可以设置这种类型的断点。
  • 方法断点Method breakpoints:当你进入和退出方法的时候会进行触发的断点,一般用来确认方法是否成功执行和退出。
  • 属性观察点Field watchpoints:当程序读取某个属性,或者修改某个属性的时候进行触发。
  • 异常断点Exception breakpoints:当程序抛出某个异常的时候触发。

设置断点

  • 行断点:直接点击左边即可,或者直接用⌘F8在光标处下断点。如果该行包括lambda表达式,会自动提醒到底是哪一处下断点。
  • 方法断点:在方法声明的地方下断点即可。如果是默认的构造方法,直接在类声明的地方下断点。如果希望能够匹配多个类或者多个方法,可以直接打开debug的工具栏,自行添加。
  • 属性观察点:直接在对应的属性行上下断点即可。
  • 异常断点:需要打开debug的工具栏中的查看断点(shift+command+F8),自行添加

管理断点

如果是非异常断点,那么只需要点击对应的断点就可以取消了。当然也可以用查看断点功能来批量取消。其它的像一些复制之类的,直接移动即可,并不是重点。

配置断点属性

断点配合上特定的条件,才是日常中经常使用的。你可以直接在断点处右击,就可以看到一些详细的设置了。

image-20210201225752232

官网上为这些所有的断点的不同状态设置了不同的图标。

生产中的小tips

  • 尽量不要使用那些printf的代码来打印一些数值,而是尽量使用debugger
  • 尽量多使用日志消息记录的断点,可以直接使用shift+鼠标点击来下这类的断点。