乐趣区

关于java:IntelliJ-IDEA远程Debug-Linux的Java程序找问题不要只会看日志了

1 前言

欢送拜访南瓜慢说 www.pkslow.com 获取更多精彩文章!

咱们习惯于在本地开发的时候debug,能疾速定位与解决问题,那部署在服务器上是不是就没有方法了呢?只能通过查看日志来定位?

不是的,在远端的服务器上,咱们一样能够debug

2 IDEA 的 debug

咱们先来看一下在 IntelliJ IDEA 间接 debug 是怎么的。

先筹备一个简略的 Java 程序:

package com.pkslow.basic;
import java.util.Map;

public class RemoteDebug {public static void main(String[] args) {System.out.println("------------------start------------------");
        
        System.out.println("get all the system environment");
        Map<String, String> envs = System.getenv();

        System.out.println("\nprint out the contains `HOME`");
        System.out.println("------env HOME------");
        envs.entrySet().stream()
                .filter(env -> env.getKey().contains("HOME"))
                .forEach(env -> {System.out.println(env.getKey() + ":" + env.getValue());
                });

        System.out.println("------------------end------------------");
    }
}

性能很简略,获取所有零碎环境变量,并打印出含有 HOME 字段的。

Debug很简略,间接点击以下按钮就能够:

置信大家都晓得这一点,但应该很多人都不会留神,IDEA到底做了什么,为什么就能够调试了呢?咱们看一下控制台的日志就明确了:

/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n -javaagent:/Users/pkslow/Library/Caches/IntelliJIdea2019.3/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/charsets.jar:" com.pkslow.basic.RemoteDebug
Connected to the target VM, address: '127.0.0.1:59313', transport: 'socket'

简化一下,不重要的参数去掉:

java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n com.pkslow.basic.RemoteDebug

这就是能够 Debug 的起因,利用了 Java Agent 原理。这个性能很弱小,相似一个 AOP,代理了Java 程序,能够利用它进行调试、热部署等。

3 调试本地程序

咱们先试试如何能够调试本地程序,不是间接在 IDEA 上调试。先要编译出 class 文件 RemoteDebug.class,而后按package 构造放好。我通过 mvn clean compile 来编译。

启动程序,在 target/classes/ 目录执行:

$ java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50050,suspend=y,server=y com.pkslow.basic.RemoteDebug
Listening for transport dt_socket at address: 50050

而后程序就会期待调试客户端的连贯,不会往下执行。

配置 IDEA 以进行调试:

配置实现保留后,点击 debug 就能够了:

程序曾经进入 debug 模式:

咱们曾经执行到了其中一行,当初看看服务端:

IDEA 是同步的,并且的确曾经管制了服务端 Java 的执行。

4 近程调试 Linux Java 程序

先把程序部署在 Linux 上:

$ scp -P 22 ./com/pkslow/basic/RemoteDebug.class root@xxx.xx.xx.xxx:/root/remoteDebug/com/pkslow/basic/
RemoteDebug.class                              100% 2572   282.5KB/s   00:00    

通过以下命令在服务端启动程序,这里调试端口改为9999,因为局部端口在近程服务器并没有开启:

java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug

本地电脑 IDEA 配置如下:

开始debug,失常管制了近程服务端的Java

服务端的实时执行状况:

让程序执行完如下:

$ java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug
Listening for transport dt_socket at address: 9999
------------------start------------------
get all the system environment

print out the contains `HOME`
------env HOME------
JAVA_HOME:/root/jdk1.8.0_131
HOME:/root
------------------end------------------

5 总结

本文一步步摸索如何进行调试近程的服务器,这在呈现问题时定位还是十分有用的。毕竟能够实时看到服务端运行环境。


欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …

多读书,多分享;多写作,多整顿。

退出移动版