操作
最常用的操作有5种,如图中的标记:
Step Over
:程序往下执行一行。Step Into
:进入方法内,可以进入自己的方法或第三方的方法,无法进入JDK的方法。Force Step Into
:强制进入方法内,包括Step Into
无法进入的JDK方法。Step Out
:退出方法,和Step Into
(Force Step Into
)配合使用。Resume Program
:恢复运行程序,运行到下一个断点的地方。
断点
断点有四种:
- 行断点
- 方法断点
- 字段断点
- 异常断点
行断点
行断点,是一种最常用的断点,在断点处暂停。
图标是圆形。
方法断点
方法断点,作用在方法上,通常我们会打在接口方法上,这样会在其实现类上断点。
有了这种断点,我们就无需通过上下文环境去分析,应该在哪个实现类上打断点。
特别的,我们还可以定义,是在方法进入时生效、还是在方法退出时生效。
右键断点图标
,即可进行定义。
字段断点
字段断点,作用在字段上。在字段发生变更或者被访问时暂停。
图标:眼睛。
在IDEA中,默认只有字段发生变更时暂停,我们可以设置其在被访问时也生效。
右键断点图标
,即可进行定义。
异常断点
点击View Beakpoints...
。
点击+
,异常类型。
例如,我们勾选了Java Exception Breakpoints
的java.lang.NullPointerException
。
之后,即使我们没有打断点,程序也会在抛出空指针异常处暂停。
断点条件
例如,现在有一段代码如下:
1 | int count = 0; |
我们想在i == 99
的时候,暂停。
则我们可以右键点击断点的图标,在"Condition"处填入i == 99
。
降帧
当我们从"A方法"已经进入"B方法"时,通过降帧(退帧)可以返回到调用B方法前。
通常用于当我们发现某个重要流程被我们跳过了,想再看一下,可以用这种方法先回退。
主动抛异常
右键,选择Throw Exception
。
然后,在弹出框,定义异常。
强制返回
强制结束当前程序运行流程,直接返回。
执行表达式
执行表达式,用于执行一段我们编写的代码,可以用来查看数据、修改数据等。
假设存在一段如下:
1 | int age = getAge(); |
点击"执行表达式"
输入我们的表达式,执行。
多线程Debug
假设存在一段代码如下:
1 | private static void testSuspend() throws InterruptedException { |
我们打个断点,再右键点击断点,会看到Suspend
有两种模式:All
和Thread
。
Thread
:暂停进入断点的线程,不影响其他线程执行。所有进入断点的线程依次Debug。All
:暂停全部线程。这时候只能Debug第一个暂停线程。
远程Debug
远程调试,调试部署在远程服务器上的应用。
注意:使用远程Debug的环境必须不能对外网访问,否则可能存在安全隐患。
配置本地
在本地新增"Remote JVM Debug"。
配置远程的地址,JVM的版本等。
需要注意的是,我们选择不同的JVM版本,左侧的参数也不一样。这些参数我们需要拷贝下来,之后配置生产需要用。
配置远程
例如,我们的JVM是8版本的,即参数为
1 | -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 |
我们在生产的启动命令为
1 | java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar spdbug-0.0.1-SNAPSHOT.jar |
Debug
然后我们点击虫子的图标。
远程Debug即开始了。我们发一笔请求到远程的服务器,会发现在本机有断点了。