IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了(推荐)
1前言
我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位?
不是的,在远端的服务器上,我们一样可以debug。
2IDEA的debug
我们先来看一下在IntelliJIDEA直接debug是怎样的。
先准备一个简单的Java程序:
packagecom.pkslow.basic; importjava.util.Map; publicclassRemoteDebug{ publicstaticvoidmain(String[]args){ System.out.println("------------------start------------------"); System.out.println("getallthesystemenvironment"); Mapenvs=System.getenv(); System.out.println("\nprintoutthecontains`HOME`"); System.out.println("------envHOME------"); 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
简化一下,不重要的参数去掉:
java-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=ncom.pkslow.basic.RemoteDebug
这就是可以Debug的原因,利用了JavaAgent原理。这个功能很强大,类似一个AOP,代理了Java程序,可以利用它进行调试、热部署等。
3调试本地程序
我们先试试如何可以调试本地程序,不是直接在IDEA上调试。先要编译出class文件RemoteDebug.class,然后按package结构放好。我通过mvncleancompile来编译。
启动程序,在target/classes/目录执行:
$java-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50050,suspend=y,server=ycom.pkslow.basic.RemoteDebug Listeningfortransportdt_socketataddress:50050
然后程序就会等待调试客户端的连接,不会往下执行。
配置IDEA以进行调试:
配置完成保存后,点击debug就可以了:
程序已经进入debug模式:
我们已经执行到了其中一行,现在看看服务端:
与IDEA是同步的,并且确实已经控制了服务端Java的执行。
4远程调试LinuxJava程序
先把程序部署在Linux上:
$scp-P22./com/pkslow/basic/RemoteDebug.classroot@xxx.xx.xx.xxx:/root/remoteDebug/com/pkslow/basic/ RemoteDebug.class100%2572282.5KB/s00:00
通过以下命令在服务端启动程序,这里调试端口改为9999,因为部分端口在远程服务器并没有开启:
java-agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=ycom.pkslow.basic.RemoteDebug
本地电脑IDEA配置如下:
开始debug,正常控制了远程服务端的Java:
服务端的实时执行情况:
让程序执行完如下:
$java-agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=ycom.pkslow.basic.RemoteDebug Listeningfortransportdt_socketataddress:9999 ------------------start------------------ getallthesystemenvironment printoutthecontains`HOME` ------envHOME------ JAVA_HOME:/root/jdk1.8.0_131 HOME:/root ------------------end------------------
5总结
本文一步步探索如何进行调试远程的服务器,这在出现问题时定位还是非常有用的。毕竟可以实时看到服务端运行环境。
到此这篇关于IntelliJIDEA远程DebugLinux的Java程序,找问题不要只会看日志了的文章就介绍到这了,更多相关IDEA远程DebugLinux的Java程序内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。