IntelliJ IDEA远程Debug Linux的Java程序怎么使用

这篇文章主要介绍“IntelliJ IDEA远程Debug Linux的Java程序怎么使用”,在日常操作中,相信很多人在IntelliJ IDEA远程Debug Linux的Java程序怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”IntelliJ IDEA远程Debug Linux的Java程序怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1 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很简单,直接点击以下按钮就可以:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第1张

相信大家都知道这一点,但应该很多人都不会注意,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程序,可以利用它进行调试、热部署等。

2 调试本地程序

我们先试试如何可以调试本地程序,不是直接在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以进行调试:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第2张

配置完成保存后,点击debug就可以了:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第3张

程序已经进入debug模式:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第4张

我们已经执行到了其中一行,现在看看服务端:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第5张

IDEA是同步的,并且确实已经控制了服务端Java的执行。

3 远程调试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配置如下:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第6张

开始debug,正常控制了远程服务端的Java

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第7张

服务端的实时执行情况:

IntelliJ IDEA远程Debug Linux的Java程序怎么使用  idea 第8张

让程序执行完如下:

$ 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------------------

到此,关于“IntelliJ IDEA远程Debug Linux的Java程序怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram