IntelliJ IDEA Java程序调试

1. 创建或打开一个Java项目

如果有需要调试的项目源码,可以直接打开一个存在的项目,如果没有项目源码只有class或者jar文件的话需要在IDEA中添加jar到依赖库。

2. 调试模式参数配置

Java应用程序可以在运行时添加启动参数即可调试,需要注意的是不同的JDK版本的调试参数可能会不一样。

JDK5-8:

  1. -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

JDK9+:

  1. -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005

suspend=n表示的是启动Java应用时是否立即进入调试模式,suspend=y表示启动即暂停,suspend=n则表示启动时不需要暂停。address=*:5005表示的是Debug监听的服务地址和端口,根据需求修改,上述配置会监听到0.0.0.0

3. 在IDEA中启用远程调试

点击工具栏的Add Configuration...,点击左侧的+号,选择Remote,如下图:

image-20200519165645657

配置远程Debug信息,填入远程服务的IP地址、端口信息,注意JDK版本,JDK8+使用的调试参数是不一样的,最后如果默认选择的classpath不对需要手动选择下classpath

image-20200519165749366

4. 远程调试Java应用程序

以调试模式启动Java应用也很简单,只需要加上调试参数即可:

  1. java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Test

这个时候程序会处于等待状态(光标会一致闪烁,等待远程连接):

image-20200519171103826

4.1 有源码调试

假设我们有需要调试的应用程序代码,我们可以直接在Java类上设置断点即可调试。

示例-Test.java:

  1. /**
  2. * Creator: yz
  3. * Date: 2020-05-19
  4. */
  5. public class Test {
  6. public static void main(String[] args) {
  7. System.out.println(args);
  8. }
  9. }

在待调试的程序点设置断点,并点击IDEA Debug配置: image-20200519171214694

这个时候就可以看到程序已经运行至断点的位置了:

image-20200519171503538

4.2 无源码,只有jar或者class文件调试

如上示例,假设我们这个时候只有Test.class的class文件或者Test.class对应的test.jar文件,我们应该怎么调试呢?

只有class的情况下我们进入源码所在的包,然后打包成jar文件即可:

  1. cd src
  2. jar -cvf test.jar *
  3. ls -la

命令执行结果:

  1. 已添加清单
  2. 正在添加: Test.class(输入 = 342) (输出 = 187)(压缩了 45%)
  3. [yz@yz:src]$ ls -la
  4. total 16
  5. drwxr-xr-x 4 yz staff 128 May 19 17:21 .
  6. drwxr-xr-x 5 yz staff 160 May 19 16:57 ..
  7. -rw-r--r-- 1 yz staff 342 May 19 17:20 Test.class
  8. -rw-r--r-- 1 yz staff 641 May 19 17:22 test.jar

这个时候统计目录就会生成一个test.jar,我们只需要把这个jar添加到classpath然后设置好断点就可以调试了。

添加jarIDEAclasspath,可以直接选择jar目录或者jar文件然后右键Add as Library,也可以选择项目以外的目录或者jar文件。

示例-直接选择项目中的jar:

image-20200519172506843

示例-选择项目以外的jar:

image-20200519173445416

选择jar需要添加的classpath信息,通常不需要修改:

image-20200519172552668

启动Test示例:

  1. java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -cp test.jar Test

展开test.jar并在Test.class中设置断点,最后点击工具栏的调试按钮即可调试:

image-20200519173128450

image-20200519173228789

5. 调试Tomcat示例

常见的中间件启动脚本中都内置了调试参数,如Tomcat的bin/catalina.sh就内置了调试参数:

image-20200519174040635

但最简单直接的方式是直接在Tomcat的启动脚本catalina.sh(Windows换成catalina.bat)中添加Debug参数即可:

  1. JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

image-20200519175322193

然后再使用catalina.sh启动Tomcat就会发现Tomcat会处于等待远程连接状态:

image-20200519175350559

接下来就只需要导入Tomcat的jar并设置断点就可以调试了。

添加Tomcatlib目录到IDEAclasspath:

image-20200519175529897

展开左侧External Libraries->lib->选择需要断点的类->点击工具栏的Debug:

image-20200519175927288

然后在webapps/ROOT目录下新建一个test.jsp:

  1. <%=request.getParameter("id")%>

最后点击工具栏的Debug后控制台的Tomcat就会自动启动,知道触发断点为止,上图示例中我设置的断点是org.apache.catalina.connector.RequestFacade#getParameter,所以需要使用浏览器请求任意页面并传入参数(访问http://localhost:8080/test.jsp?id=yzmm)即可进入断点:

image-20200519180418785

其实调试Tomcat最简单的方式是直接启动一个Maven Web项目并使用Tomcat启动,然后在pom.xml中配置对应版本的Tomcat的依赖就可以直接Debug了,使用这种调试方法可以让您学会如何使用IDEA调试任意的Java程序,仅此而已。

6. 条件断点

某些时候我们需要设置一个断点调试的时候会发现一些我们不希望关心的断点也进来了,会比较影响Debug,这个时候我们可以使用IDEA的条件断点的方式来设置断点。先在对应的行设置一个断点,然后再点击断点的红点图标右键设置断点停止条件了。例如下图示例我们设置一个当用户名为admin时进入调试模式:

image-20200920162426500

7. 动态获取表达式值

调试模式时我们可以点击下图的计算器图标或者使用快捷键⌥F8来执行任意的Java代码片段,如下图:

image-20200920163423170

如果想要执行多行,点击放大/缩小的小图标切换:

image-20200920163740180

8. 查看所有断点、暂停/启用所有断点

如果断点数量被设置的比较多,可能会比较难于管理,所幸,IDEA提供了对所有断点批量管理的功能,点击下图的小图标或者使用快捷键⇧⌘F8即可批量管理所有断点:

image-20200920164033834

断点批量管理功能,新版的IDEA还新增了异常断点功能:

image-20200920164429170

如果想要一次性放过所有的断点而又不想一个个的去勾掉断点,可以点击红色圆圈带×的小图标:

image-20200920164306758

这样就可以看到所有已被设置了断点的图标都变成了灰色,也就是暂停了所有断点功能:

image-20200920165244373

再次点击该图标就会恢复到调试模式。

9. 接口调试/成员变量值监控

在使用IDEA调试的时候可以把断点设置到接口方法上,所有的接口实现类的被设置了断点的方法都可以Debug,如下图:

image-20200920170005507

IDEA还支持对成员变量值进行监控,当被设置了监控的变量值发生改变时会进入断点:

image-20200920170948889

10. 代码覆盖率/性能

IDEA自带了CoverageCPU Profiling功能,运行程序的时候选择对应的小图标就可以看到测试结果了,如下图:

image-20200920171731635