一篇文章详解JAVA远程debug

 更新时间:2023年08月15日 09:11:20   作者:_BugMan  
这篇文章主要给大家介绍了关于JAVA远程debug的相关资料,日常我们debug是经常用的,但是本地还好说,远程debug就有点难度,需要的朋友可以参考下

1.什么是远程debug?

远程debug,也就是可以在本地debug远端部署的程序,这对于定位远端环境中的问题非常有用,之所以我们说是远端环境,而不说是对定位生产环境中的bug很有用,是因为远程调试通常在开发和测试阶段使用,而不建议在生产环境中使用,因为可能会对性能产生影响。当然,在没有办法的时候使用远程debug,是最高效的定位生产问题的手段之一。

远程debug可以理解为一种JVM规范,当然其不是单独的一个规范,它是属于JDWP(Java Debug Wire Protocol)协议中的一部分,该协议定义了 Java 虚拟机(JVM)与调试器之间的交互方式。通过 JDWP,开发者可以在开发工具中设置断点、查看变量、执行代码等操作,以便对运行中的 Java 程序进行调试。说直白点就是遵循了该协议的JVM,就支持debug,也支持远程debug。

2.远程debug普通JAVA程序

2.1.环境

  • JDK:1.8
  • 编译器:IDEA

2.2.测试程序

这里我们写了很简单一个测试程序,每1秒,i自加1,然后将其打包成jar包

public static void main(String[] args) throws InterruptedException {
        int i=0;
        while (true){
            Thread.sleep(1000);
            i++;
        }
    }

我估计很多同学一下会忘了这么在IDEA中将普通java se程序如何打包成jar了,这里贴心一点,给出打包方法,用打包jar包的maven插件,指定好main入口,然后install即可:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.eryi.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.3.程序启动指令

要远程debug,首先在程序启动时就要用参数开启远程debug,完成参数指令如下:

  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<host>:<port>

  • transport:指定调试信息传输的方式,一般使用 dt_socket
  • server:指定是否为调试服务端,使用 y 表示是。
  • suspend:指定是否在启动时暂停,使用 n 表示不暂停。
  • address:指定调试监听的主机和端口,也就是通过该端口来进行远程debug的。

以我们上面的程序为例,完成的启动命令为:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:5005 -jar test-1.0-SNAPSHOT.jar

启动成功会显示正在监听debug的端口:

2.4.编译器配置

我们想要在IDEA中远程debug,需要进行配置:

add configurations

 add new configuration—>remote

配置:

开始debug:

可以看到程序进入了断点。

3.远程debug JAVA Web程序

tomcat作为常用的web server为了方便使用,自然也支持了远程debug的功能。普通java程序是用java -jar启动,tomcat是用启动脚本启动,启动脚本里记录的就是tomcat启动要执行的所有命令,远程debug也写在里面。

Windows环境下修改start.sh,在第一行加上以下命令:

export CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=<host>:<port>,server=y,suspend=n"

Linux环境下修改start.bat,在第一行加上以下命令:

set "CATALINA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=<host>:<port>,server=y,suspend=n"

4.远程debug spring boot程序

spring boot项目作为一个jar,是可以用java -jar然后跟参数这种启动普通Java程序debug的方式来进行debug的,除此之外,spring boot还提供了一个更方便的远程debug的方式,就是将参数配置在spring boot的打包插件中。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<host>:<port></jvmArguments>
            </configuration>
        </plugin>
    </plugins>
</build>

总结

到此这篇关于JAVA远程debug的文章就介绍到这了,更多相关JAVA远程debug内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA最佳配置(推荐)

    IntelliJ IDEA最佳配置(推荐)

    这篇文章主要介绍了IntelliJ IDEA最佳配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 透过Spring源码查看Bean的命名转换规则图文详解

    透过Spring源码查看Bean的命名转换规则图文详解

    Java Bean是一种 Java 编程语言编写的可重用软件组件,包括符合一定规范的Java 类、属性和方法,用于描述和处理应用程序中的数据对象,下面这篇文章主要给大家介绍了关于透过Spring源码查看Bean的命名转换规则的相关资料,需要的朋友可以参考下
    2023-06-06
  • Springboot实现VNC的反向代理功能

    Springboot实现VNC的反向代理功能

    这篇文章主要介绍了Springboot实现VNC的反向代理,搭建过程也很简单,通过注册bean拦截指定URL路径进行自定义操作,具体实例代码跟随小编一起看看需要的朋友可以参考下
    2021-09-09
  • Java设计模式之命令模式

    Java设计模式之命令模式

    这篇文章介绍了Java设计模式之命令模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • SpringBoot面试突击之过滤器和拦截器区别详解

    SpringBoot面试突击之过滤器和拦截器区别详解

    过滤器(Filter)和拦截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面编程)思想实现的,用来解决项目中某一类问题的两种“工具”,但二者有着明显的差距,接下来我们一起来看
    2022-10-10
  • Spring为什么不推荐使用@Autowired注解详析

    Spring为什么不推荐使用@Autowired注解详析

    @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java Mybatis中的 ${ } 和 #{ }的区别使用详解

    Java Mybatis中的 ${ } 和 #{ }的区别使用详解

    这篇文章主要介绍了Mybatis中的 ${ } 和 #{ }的区别使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 深入理解以DEBUG方式线程的底层运行原理

    深入理解以DEBUG方式线程的底层运行原理

    说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到JVM 了。其实大家明白了Java的运行时数据区域,也就明白了线程的底层原理,今天带着大家一步一步DEBUG,来看看线程到底是怎么运行的,顺便把IDEA的DEBUG方法简单讲一下
    2021-06-06
  • SpringBoot整合Security实现权限控制框架(案例详解)

    SpringBoot整合Security实现权限控制框架(案例详解)

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框,是一个重量级的安全管理框架,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • ArrayList及HashMap的扩容规则讲解

    ArrayList及HashMap的扩容规则讲解

    今天小编就为大家分享一篇关于ArrayList及HashMap的扩容规则讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论