IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了(推荐)

1 前言

我们习惯于在本地开发的时候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

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

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 总结

本文一步步探索如何进行调试远程的服务器,这在出现问题时定位还是非常有用的。毕竟可以实时看到服务端运行环境。

到此这篇关于IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了的文章就介绍到这了,更多相关IDEA远程Debug Linux的Java程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Intellij IDEA中使用Debug(图文教程)

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码. 所以学习下如何在Intellij IDEA中使用好Debug,主要包括如下内容: 一.Debug开篇 二.基本用法&快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中断Debug 十.附:JRebel激活 一.Debug开篇 首先

  • 详解IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式)

    在使用IDEA调试程序的时候,有时候在上一次tomcat关闭未完全的时候,再一次启动debug模式时会出现如下提示 提示我们端口127.0.0.1:3934这个端口被占用,无法debug模式运行程序. 对于还不怎么熟悉使用IDEA的开发而言,会非常奇怪为什么启动tomcat容器运行程序的时候不是使用8080端口,而是用到3934(也可能是其他的端口号). 于是运行cmd系统命令使用netstat -ano查看系统中正在被使用的端口列表,却发现这个端口并不在列表中. 很奇怪的事. 经过研究,发现原

  • Linux下执行java程序的方法

    想要在Ubuntu上运行java程序,可以将java程序编译成功后打包,然后在Ubuntu上用命令执行jar文件 具体操作如下: 1.Windows上使用eclipse编译java工程,编译完成后导出为Runnable JAR File 例如,此处将test工程中的Test2文件export为MyTest2.jar文件 2.Ubuntu上java环境安装 ①jdk官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-down

  • Tomcat使用IDEA远程Debug调试的讲解

    Tomcat运行环境:CentOS6.5.Tomcat7.0.IDEA 远程Tomcat设置 1.在tomcat/bin下的catalina.sh上边添加下边的一段设置 CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=60222,suspend=n,server=y" 2.address=60222 这个是后边IDEA设置的时候需要用到的调试端口,可以任意设置一个未使用的端口,但是后边的配置都要一致. IDEA设

  • Intellij idea远程debug连接tomcat实现单步调试

    web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是Intellij idea,可以通过如下方法实现: 开启debug端口,启动tomcat 以tomcat7.0.75为例,打开bin目录下的catalina.bat文件,如下图,可以看到默认的debug端口是8000,如果本地的8000已经被占用,请改成一个未占用的端口号: 在bin目录下执行命令catalina.bat jpda start,可以启动tomcat并开启远程调试的端口 在Intellij idea中远程连接to

  • 你不知道的 IDEA Debug调试小技巧(小结)

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个线程断下来,但其他线程却已经执行过了:而将其改为 Thread 后,就可以多个线程都断下来,并且可以很方便的切换线程的执行流程,这就是多线程调试. 在debug控制台能够很方便的查看线程的执行状态,也可以很方便的选择某个线程去执行: 二.回退断点 不知道大伙有没有遇到这样一个问题,当我们进行debu

  • linux下执行java程序的sh脚本分享

    今天大概耗费了快一天的时间研究怎么用脚本执行java程序,终于实现了,分享一下 (1)在linux下写一个.sh文件 (2)文件内容如下: 复制代码 代码如下: #!/bin/sh         //bash文件头 APP_HOME=/home/blmcrm/crm/A      //要执行的java文件中bin文件的上一个目录,我的目录是/home/blmcrm/crm/A/bin/blm......(后面不写了),总之就是写bin目录前面的部分,因为jar包在bin目录里面,如果不在bin

  • IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了(推荐)

    1 前言 我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位? 不是的,在远端的服务器上,我们一样可以debug. 2 IDEA的debug 我们先来看一下在IntelliJ IDEA直接debug是怎样的. 先准备一个简单的Java程序: package com.pkslow.basic; import java.util.Map; public class RemoteDebug { public static void

  • Intellij IDEA远程debug教程实战和要点总结(推荐)

    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系,本地的Java文件在远程JVM建立联系和通信.此篇是Intellij IDEA远程调试的教程汇总和原理解释,知其然而又知其所以然. 本机Intellij IDEA远程调试配置 1,打开Inteliij IDEA,顶部菜单栏选择Run-> Edit Configurations,进入下

  • Linux通用java程序启动脚本代码实例

    虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. start函数中,nohup部分其实也可以提出来放入一个配置变量中.这里没有修改直接贴上作者的原文 脚本代码如下: #!/bin/sh #该脚本为Linux下启动java程序的通用脚本.即可以作为开机自启动service脚

  • 解决cmd运行java程序“找不到文件”提示的方案

    一般我们在运行java代码时,运行器出现这样的问题的时候,说明我们当前的路径不是java文件存放路径. 第一步:我们需要找到我们存放我们的java代码的文件夹,然后在上面的"搜索"栏上输入"cmd",直接回车. 第二步:弹出"命令提示符",我们就会知道我们的"命令提示符"上的路径就会和我们的java代码存放的路径一致了. 第三步:我们根据我们保存的java文件名输入以下代码,对我们的代码进行打印,具体如下: 第一次输入:jav

  • 如何用java程序(JSch)运行远程linux主机上的shell脚本

    运行远程主机上的shell脚本 下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本.(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本).并且通过java程序获得shell脚本的输出. 首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本. <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch<

  • 因不会远程debug调试我被项目经理嘲笑了

    目录 1,远程DEBUG的必要性 2,IDEA构建SpringBoot测试Demo 3,测试Demo项目配置支持远程调试 4,IDEA打包jar 5,启动jar并且带启动参数支持远程调试 6,IDEA远程DEBUG配置 7,IDEA远程DEBUG测试 8,eclipse远程DEBUG实现 9,打war包方式配置远程DEBUG 10,远程debug视频教程+文档+源码下载 大家好,我是曹尼玛,刚从培训机构毕业,去一家单位上班一周了- 这一周项目经理让我熟悉了项目业务,架构和设计,不算难,凭借我培训

  • java程序员必会的远程debug教程

    目录 正文 启动添加参数 配置idea 点击 editConfigurations... 点击左上角的+号,选择Remote Jvm Debug 填写地址和端口号 启动debug模式 测试 正文 现在都是拆分的比较细的微服务了,当系统运行在测试环境出现问题的时候,就需要按照日志来分析出什么问题了.有的能看出来,要是年久失修的老项目,那么说不定连log都没有.纯纯的看源码找问题,效率就很低了. 其实这个时候还可以远程debug,来更精确的定位问题.效率也是高高滴. 这个之前在工作中其实一直在使用,

  • java程序员必须要学会的linux命令总结(推荐)

    1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的xml文件 2.查看一个程序是否运行 ps –ef|grep tomcat 查看所有有关tomcat的进程 3.终止线程 kill -9 19979 终止线程号位19979的进程 pkill -9 java 批量终止java进程 4.查看文件,包含隐藏文件 ls -al 5.当前工作目录 pwd 6.复制文件 c

  • 解决VScode配置远程调试Linux程序的问题

    下面看下VScode远程调试Linux程序的问题,具体内容如下,一起看看吧! 最近在Linux上调程序,但是gdb使用属于入门阶段,主要是没有图形化界面直观.在网上查找了有两个方案可选,一个是通过VisualStudio2019的远程调试功能,因为最近一直在用VScode,所以没有试,之后有时间了可以试一下.另一个方案就是通过VScode的Remote Development插件(微软官方提供的)进行远程调试.本文介绍下这个方案. 虽然网上也有其他的文章进行介绍,但是都是写的成功的情况,没有写出

随机推荐