Java之远程Debug

背景知识

Java提供了一个很方便方便调试工具,其使用名为JDWP(Java Debug Wire Protocol)协议用于连接调试器和目标程序的协议。JVM自带该协议,我们可以通过命令查看java -agentlib:jdwp=help 帮助信息。
我们一般是在启动调试程序的Java命令行参数中使用JDWP,使用方式如下java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 OurApplication,在启动java应用程序是,增加-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005参数则表示以调试模式启动应用程序
这里需要先说明两个概念,调试器和被调试程序:

  • 调试器(debugger):指我们在客户端调试用的程序,如我们在idea上新建一个Remote JVM Debug,此时idea为我们新建了一个调试器
  • 被调试程序(debugee):顾名思义,就是我们运行的程序。

其中各个参数的说明如下:

  • transport,可选值有
    • dt_socket. 表示通过socket连接,是一个通用的传输方式,可以跨机器连接,也就是调试器和被调程序可以不在一台机器上,当然也可以在同一台机器上。所以这种一般是我们比较常用的模式
    • dt_shmem,表示使用共享内存,此种方式限制了被调试程序和调试器在同一台机器上。
  • server,如果为y的话,表示等待调试器连接,如果为n的话,表示连接address指定的调试器,这两者的区别
    • 当值为y的时候,可以理解成被调试程序先启动,然后等待调试器连接,一般远程调试的时候设置的值就是y
    • 当值为n的时候,是调试器先启动,然后程序在启动时连接到程序器,我们在本地idea调试的时候,设置的值就是n
  • suspend,是否阻塞,如果为y的话,目标程序的VM启动会暂停,直到有调试器连接的时候才会继续,如果为n的话,目标程序VM会正常启动
  • address,传输连接的地址,如果server为n的话,表示debugger的地址,如果server=y 的话,表示服务器监听地址
    这里是官方演示的使用示例:在这里插入图片描述

实战

前置准备

我们准备如下代码
package com.demo.main;

/**
 * @author 
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

同时因为为了打出一个可执行的jar包,这里在pom文件中引入了maven-assembly-plugin, 内容如下

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        com.demo.main.Main
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

执行命令 mvn clean install 打出一个可执行的jar包
在这里插入图片描述

以debug方式启动被调试程序

在打出可执行jar包之后,执行如下命令
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 remote-debug-demo-1.0-SNAPSHOT-jar-with-dependencies.jar
此时程序并不会直接执行,会打印一行内容
Listening for transport dt_socket at address: 5005
看到如下日志,表示启动成功。
程序不会执行的原因是我们设置了suspend=y,表示阻塞等待调试器连接。如果我们是一个web服务器程序,可以设置为n,这样不会阻塞vm的启动,

Idea中启动调试器

我们现在对应代码上打好断点
在这里插入图片描述
然后新建一个Remote JVM Debug,这里我录制了一个gif
在这里插入图片描述
相关参数的我通过截图说明:
在这里插入图片描述
然后就是启动调试了:
在这里插入图片描述

参考资料
https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html#SPI
https://www.baeldung.com/java-application-remote-debugging

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Tomcat上进行远程调试,有几种方法可以实现。一种方法是通过在Tomcat的启动脚本中添加调试参数。例如,在startup.sh脚本中添加以下参数:declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9898" \[3\]。这将在Tomcat启动时开启一个调试端口,可以通过远程连接进行调试。 另一种方法是在Eclipse中创建一个远程调试配置。在Eclipse中,点击菜单项"Run" -> "Debug Configurations",然后双击"Remote Java Application"。在配置对话框中,输入Tomcat的主机名和端口号(通常是9000),然后点击"Debug"按钮。这将启动一个远程调试会话,可以在Eclipse中进行调试。\[2\] 还有一种方法是通过双击debug.bat文件来以调试方式启动Tomcat。这将使用默认的调试配置启动Tomcat,并在本地调试。\[1\] 总结来说,要在Tomcat上进行远程调试,可以通过在Tomcat的启动脚本中添加调试参数,或者在Eclipse中创建一个远程调试配置。另外,也可以通过双击debug.bat文件来以调试方式启动Tomcat。 #### 引用[.reference_title] - *1* [开启Tomcat远程调试(转)](https://blog.csdn.net/weixin_30542079/article/details/98864232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [tomcat远程debug配置详解](https://blog.csdn.net/tianyazaiheruan/article/details/45500459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [tomcat远程debug](https://blog.csdn.net/steven_bill/article/details/113178573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值