Java远程debug调试的操作步骤

 更新时间:2025年04月16日 09:04:05   作者:liyanchao2018  
日常项目中,通常我们的代码都是部署到远程的服务器,有时线上出现了问题,经常需要我们增加一些日志来排查问题,但是如果是测试环境的场景下或者我们能进行远程调试的话,我们就可以使用远程的Debug方式进行远程调试,下面给大家介绍一下Java远程debug调试的操作步骤

idea启动java项目,debug调试远程项目代码操作步骤:

1、将项目打成jar包,上传服务器,使用命令启动jar

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp

启动命令解析: 这个命令使用的是主类名启动,而非 -jar myApp.jar的方式。

1.1、解析启动命令含义

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 是一个用于启动 Java 程序并开启远程调试功能的命令。下面为你详细解释该命令中各个部分的含义:

1.2、整体命令结构

  • java:这是 Java 虚拟机(JVM)的启动命令,用于执行 Java 程序。
  • -agentlib:jdwp:这是一个 JVM 选项,用于加载 Java 调试线协议(Java Debug Wire Protocol,JDWP)代理库。JDWP 是一种允许调试器与被调试的 Java 虚拟机进行通信的协议,借助这个选项就能让 JVM 支持远程调试。

1.3、JDWP 选项参数

  • transport=dt_socket:指定了调试器与 JVM 之间的通信传输方式。dt_socket 表示使用套接字(socket)进行通信,也就是通过网络来传输调试信息,这是最常用的传输方式。
  • server=y:表明当前 JVM 会作为调试服务器。意味着它会监听一个指定的端口,等待外部调试器(如 IDE 中的调试工具)来连接。
  • suspend=nsuspend 参数用于控制 JVM 在启动时是否暂停执行。n 代表 no,即 JVM 启动后不会暂停,会正常执行 Java 程序,调试器可以在程序运行过程中随时连接进行调试。若设置为 suspend=y,JVM 启动后会暂停,直到调试器连接成功才会继续执行。
  • address=8889:指定了 JVM 监听的端口号。这里 JVM 会在 8889 端口上等待调试器的连接。在启动调试器时,需要配置相同的端口号,以确保调试器能够与 JVM 建立连接。

1.4、示例场景

假设你有一个名为 MyApp 的 Java 程序,完整的启动命令可能如下:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp

此命令会启动 MyApp 程序,并开启远程调试功能,允许外部调试器通过 8889 端口连接到该 JVM 进行调试。

2、idea设置远程调试

idea打开java项目后,设置remote jvm debug,选择项目模块,host地址是jar包部署到服务器的地址,port是使用java命令启用的等待调试器链接的端口。

3、执行debug

点击debug启动项目,在浏览器上输入:http://10.1.2.133:8889/user/findAll 在idea中findAll方法中打上断点,访问这个url后,断点就会收到调用,就可以debug调试项目了。

4、java命令启动项目,使用-jar myApp.jar与主类名启动myApp的区别:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 -jar myApp.jar

解析: 服务器启动java项目,可以启动jar包或者寻找主类名启动。

这个命令不一定非要使用 -jar xxx.jar 来指定启动的 JAR 包。是否使用 -jar 选项取决于你启动 Java 程序的方式。下面为你详细分析不同情况:

情况一:使用主类名启动

如果你像给出的命令 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp 这样,直接指定主类名(MyApp)来启动 Java 程序,那么就不需要 -jar 选项。这种方式要求主类 MyApp 必须位于类路径(classpath)下,JVM 会在类路径中找到这个类并执行其 main 方法。

情况二:使用 JAR 包启动

当你想通过 JAR 包来启动 Java 程序时,就需要使用 -jar 选项。此时,你需要把 MyApp 替换为具体的 JAR 包名称,例如:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 -jar myapp.jar

在这个命令里,-jar myapp.jar 告知 JVM 从 myapp.jar 这个 JAR 包中寻找主类并执行。要注意的是,这个 JAR 包必须是可执行的,也就是在其 MANIFEST.MF 文件中指定了主类。

总结

是否使用 -jar 选项要依据你的启动需求来定:

  • 若主类在类路径中,可直接指定主类名启动,无需 -jar 选项。
  • 若要从 JAR 包启动程序,则需使用 -jar 选项指定 JAR 包名称。

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

相关文章

  • Spring Bean的包扫描的实现方法

    Spring Bean的包扫描的实现方法

    这篇文章主要介绍了Spring Bean的包扫描的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 通过Java添加Word文本框过程详解

    通过Java添加Word文本框过程详解

    这篇文章主要介绍了通过Java添加Word文本框过程详解,在Word中,文本框是指一种可移动、可调节大小的文字或图形容器。我们可以向文本框中添加文字、图片、表格等对象,下面,将通过Java编程来实现添加以上对象到Word文本框,需要的朋友可以参考下
    2019-07-07
  • Spring框架核心概念小结

    Spring框架核心概念小结

    Spring是企业级Java的开源开发框架。Spring框架的核心功能可用于开发任何java应用程序,本文重点给大家介绍Spring框架核心概念总览,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Jenkins发送测试报告邮件过程详解

    Jenkins发送测试报告邮件过程详解

    这篇文章主要介绍了Jenkins发送测试报告邮件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • RocketMQ发送事务消息详解

    RocketMQ发送事务消息详解

    这篇文章主要介绍了RocketMQ发送事务消息详解,RocketMQ分布式事务消息不仅可以实现应用之间的解耦,又能保证数据的最终一致性,传统的大事务可以被拆分为小事务,不仅能提升效率,还不会因为某一个关联应用的不可用导致整体回滚,需要的朋友可以参考下
    2023-09-09
  • springboot2.6.4集成swagger3.0遇到的坑及解决方法

    springboot2.6.4集成swagger3.0遇到的坑及解决方法

    这篇文章主要介绍了springboot2.6.4如何集成swagger3.0,在集成的过程中遇到很多问题,本文给大家分享四种问题及相应的解决方案,需要的朋友可以参考下
    2022-03-03
  • Spring JPA 错题集解决案例

    Spring JPA 错题集解决案例

    这篇文章主要为大家介绍了Spring JPA 错题集解决案例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 关于pytorch相关部分矩阵变换函数的问题分析

    关于pytorch相关部分矩阵变换函数的问题分析

    这篇文章主要介绍了pytorch相关部分矩阵变换函数,包括tensor维度顺序变换BCHW顺序的调整,矩阵乘法相关函数,矩阵乘,点乘,求取矩阵对角线元素或非对角线元素的问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • spring boot自动装配之@ComponentScan注解用法详解

    spring boot自动装配之@ComponentScan注解用法详解

    @ComponentScan的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,下面这篇文章主要给大家介绍了关于spring boot自动装配之@ComponentScan注解用法的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java中值传递和引用传递的区别

    Java中值传递和引用传递的区别

    这篇文章主要介绍了Java中值传递和引用传递的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论