目录
一、 Debug 概述
二、Deubg中常用调试按钮介绍
横排功能点介绍
竖排功能点介绍
跳转到当前执行代码的行
步过
步入
强制步入
步出
回退断点处
定位到光标处
计算表达式
三、查看参数
参数所在行后面显示
光标悬浮查看
在 Variables 里查看
在 Watches 里查看
四、条件断点
五、Debug 服务设置按钮
执行到下一个断点处直到结束
断点静音
查看/清除断点
返回到第一个断点的地方
六、多线程调试
七、异常断点调式
八、字段调式
九、方法调试
十、Stream流的断点调式
十一、远程调式
Debug 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。
最近一直想写一篇关于IDEA中如何Debug,刚好这个周末有空,就静下心来写下这篇文章,对Debug总结与学习。
我们先看下 IDEA 中 Debug 模式下的界面:
我们先说横排的 8 个按钮,我会按照横 1、横 2 这样的命名方式来介绍。
我们先在一个页面设置一个断点,然后再切换到其他页面,点击这个按钮,发现又跳转到了执行代码所在的行
步过
就是一步一步往下走,跳过所有方法:
上面的例子中即便是遇到了 system 打印方法和 test1 方法,也会跨过去继续往下执行。
在执行的过程中如果遇到了自定义的方法,可以进入方法内部,不会进入 JDK 类库中的方法。
上面的例子中,遇到了 system 方法会自动跨过去,但是遇到了自定义的方法,则会进入到方法中中执行,等执行完则会返回到方法的调用处。
不管遇到 JDK 的类库方法还是自定义方法,都会进入到方法中执行。
上面的例子中不管遇到了JDK 类库中的 system 方法还是自定义的 test1方法,都会进入到方法中执行。
步出
就是从进入的方法内部退回到方法调用处。
上面的例子中我们进入到了 test1 方法的内部,当点击步出按钮后,又回到了调用 test1 方法的地方。
回退断点处
意思就是可以回退到指定方法的调用处。
上面的例子中我们依次执行了 test1、test2、method2 方法,但是我们可以选择直接回退到 test1 方法的调用处。
步出和回退断点的区别:
一步往下执行也比较费时间。这时候我们可以先把光标放到一个指定位置,然后点击定位光标处
按钮,这时候代码就会立即执行到光标处了。
上面的例子中我们把鼠标光标移动到了下面某一行,然后点击定位光标处
按钮,代码立刻执行到了这一行。
计算表达式
可以帮助我们计算一些表达式的返回值。
从上面的例子中可以看出,我们可以在调用某些方法之前使用一些自定义参数去计算该方法的返回值。
光标悬浮到参数上,显示当前变量的信息,我经常使用这种方法,特别方便。
这里显示当前方法里的所有变量。
在 Watches 里,点击 New Watch,输入需要查看的变量:
有时候我们代码中会包含很多 for 语句,但是使用断点调试的时候会执行很多次。这时候我们可以选择断点,鼠标右键设置一个条件,只有满足该条件时,断点才会执行到此处。
上面的例子中我们给断点设置一个条件:i==50,所以以 Debug 模式运行该程序的时候我们发现此时 i 就是50。
该按钮的作用:如果下面有断点,就跳转到下一个断点处。如果没有,程序就执行结束。
有时候我们在执行到某一步的时候已经知道了结果,但是后面还有一堆断点。我想让这些断点失效,但是第二次跟踪我还想用这些断点,这时候就可以使用断点静音
。
我们在执行完代码后要清除所有断点,但是一个个去清除太浪费时间,这时候就可以使用这个按钮查看所有设置的断点,或者清除所有断点。
代码执行到某一行想返回到第一个断点处:
因为 CPU 执行线程的顺序是随机的,但是我们使用断点调试可以自定义执行下一个线程。
首先将两个线程的断点都设置成线程模式:
代码报错抛出异常了,知道是啥类型异常,希望在抛异常之前,看看数据是什么样的,为啥异常了,就可以使用这种方法,比如最常见的空指针异常
我们打个断点,点击左下角两个叠加的红色圆圈,可以查看所有断点,然后点击加号,出现5中类型断点,选择第三个Java Exception Breakpoints,选择空指针异常
打好断点后,再次debug,再发生异常前,会停留在即将发生异常的那行代码上
可用于定位某个字段在何时被赋值,何时被赋成这个值,在源码阅读时,经常搞不懂这个变量的值从哪里来的,这个断点可以很好解决这个问题
给测试类加上name,age属性
private String name;
private Integer age;
//测试代码
Test04 test04 = new Test04();
test04.setName("888");
test04.setName("444");
test04.setName("555");
test04.setName("哈哈哈");
test04.setName("999");
test04.getName();
还是一样的操作,此时断点变成了红色眼睛。
看看勾选Field access效果。跳到getName方法处
当一个接口的实现类特别多,比如spring里面比比皆是,变量类型为接口,实际调用时,可以通过强制进入方法内可以看进入哪个子类,也可采用接口方法打断点方式来选择走到哪个子类
上代码,一个接口,两个子类。测试方法中使用接口类型的变量调用print方法。在接口的print()方法打断点,是红色方块形的断点,然后运行
Java8加入了Stream流特性,把集合的操作变简单了,同时可读性也降低了。一阵链式操作,行云流水,却把人搞得丈二和尚摸不着头脑,啥玩意
idea也提供了一个很方便的功能,那就是Trace Current Stream Chain
1,打开idea,顶部菜单栏选择Run-> Edit Configurations,进入下图的运行/调试配置界面。
2,点击左上角'+'号,选择Remote。分别填写右侧三个红框中的参数:Name,Host(想要指定的远程调试端口)。
3,点击界面右下角应用按钮即可。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
程序上打上断点,点击运行。调用服务器端运行的系统程序,系统自动进入断点。
参考文章
1. https://blog.csdn.net/qq_52252193/article/details/124669570
2. idea比较好用的断点调试方法 - 方大大大 - 博客园
3.使用idea进行远程调试_win1699的博客-CSDN博客_idea远程调试