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

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

这个时候程序会处于等待状态(光标会一致闪烁,等待远程连接):
5. 4. 远程调试Java应用程序 - 图1

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配置:
5. 4. 远程调试Java应用程序 - 图2
这个时候就可以看到程序已经运行至断点的位置了:
5. 4. 远程调试Java应用程序 - 图3

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:
5. 4. 远程调试Java应用程序 - 图4
示例 - 选择项目以外的jar:
5. 4. 远程调试Java应用程序 - 图5
选择jar需要添加的classpath信息,通常不需要修改:
5. 4. 远程调试Java应用程序 - 图6
启动Test示例:

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

展开test.jar并在Test.class中设置断点,最后点击工具栏的调试按钮即可调试:
5. 4. 远程调试Java应用程序 - 图7
5. 4. 远程调试Java应用程序 - 图8