使用 JDWP 进行远程调试

本文介绍如何使用Java Debug Wire Protocol (JDWP)调试Java程序。详细步骤包括配置环境变量、启动调试模式的应用、连接调试器、设置断点及进行native级调试。此外还介绍了在Linux下启动Tomcat时如何配置JDWP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于调试Java程序来说,Java Debug Wire Protocol (JDWP, Java调试线协议)是不可多得的好东西。

使用JDWP调试应用程序的步骤如下:

1. 打开命令行,并将 jdk 安装路径下的 bin 目录添加到 PATH 环境变量。

2. 通过以下命令来启动想要调试的程序(本例中假设为Test):

  • 在Windows上:

    java -Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=y Test
    
  • 在Oracle Solaris 和/或 Linux操作系统上:

    java -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=y Test
    

通过这些启动参数, Test 类将运行在调试模式下, 并等待调试器连接到JVM的调试地址: 在Windows上是 debug, 在Oracle Solaris 或 Linux操作系统上是 8888端口 。

3. 新开一个命令行窗口, 并使用以下命令来启动 “jdb” 并将它连接到正在运行的调试服务器:

  • 在Windows上:

    jdb -attach 'debug'
    
  • 在Oracle Solaris和Linux操作系统上:

    jdb -attach 8888
    

当 jdb初始化并连接到 Test 之后, 就可以进行 Java代码级(Java-level)的调试。

4. 设置断点,并运行应用程序。例如, 在 Testmain 方法开始位置设置断点, 可以执行以下命令:

stop in Test.main run

jdb 工具执行到断点时, 就可以探查程序的当前上下文,以判断程序是否按预期正常运行。

5。(可选) 要进行 native-level 的调试, 请在运行JDWP的Java进程上附加 native debuggers 。

在 Oracle Solaris上, 可以使用 dbx 工具, 在 Linux 上, 可以使用 gdb 工具。

在Windows上, 则可以使用 Visual Studio, 进行 native-level 调试的步骤如下:

  1. 打开 Visual Studio。
  2. 点击 Debug 菜单, 选择 Attach to Process。然后选择运行JDWP的Java进程。
  3. 点击 Project 菜单, 选择 Settings 项,然后打开 Debug 标签(tab). 在 Category 下拉列表中, 选择 Additional DLLs, 并添加您想要调试的 native DLL (例如, Test.dll)。
  4. 打开 Test.dll 的源文件(一个或多个),并设置断点。
  5. jdb 窗口输入 cont, 则进程将在 Visual Studio 中设置的断点处暂停。

示例

在 Linux 下启动Tomcat的脚本中,可以使用:

export JAVA_OPTS="-Xms1024m -Xmx1024m
-verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails 
-Xloggc:$CATALINA_BASE/logs/gc.log -server
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=12346"

相关参数的含义可以参考: http://calvinliu.iteye.com/blog/876009

idea调试相关配图:

1. 打开idea窗口,确保本地有相关的代码。
2. 进入配置:

配置编辑

3. 添加 Remote:

添加 Remote

4. 设置 ip 与 端口号:

设置 ip 与 端口号

5. 完成配置:

完成配置

此时, 点击debug的那个按钮即可启动远程调试。

当然,记得加断点或者条件断点。

关于 Idea 如何进行远程调试,请参考: http://www.cnphp6.com/archives/33956

原文链接: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/introclientissues005.html

### Intellij IDEA 中 Java 远程调试配置教程 要在 IntelliJ IDEA 中实现 Java 的远程调试功能,需要完成以下几个方面的配置: #### 1. 启动远程 JVM 并添加调试参数 为了使远程 JVM 支持调试模式,需在其启动命令中加入特定的 JVM 参数。这些参数用于指定调试协议、监听地址以及是否暂停等待调试器连接。 常用的调试参数格式如下: ```bash -javaagent:jdwp=transport=dt_socket,server=y,suspend=n,address=<port> ``` 其中 `<port>` 是调试端口,可以根据实际需求调整。例如,如果希望使用 `5005` 端口,则可以写成: ```bash java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 your-application.jar ``` 这一步骤确保了远程服务能够接受来自本地 IDE 的调试连接[^1]。 #### 2. 配置 Tomcat 或其他应用服务器(可选) 如果是基于 Tomcat 的项目,可以在其启动脚本中添加类似的调试选项。具体操作是在 Tomcat 的 `/bin/catalina.sh` 文件中修改环境变量 `JAVA_OPTS`,追加以下内容: ```bash JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8086,suspend=n,server=y" ``` 保存文件并重启 Tomcat 实例后,即可通过指定端口进行远程调试[^3]。 #### 3. 创建 Remote Debugging 配置项 在 IntelliJ IDEA 中创建一个新的 Run/Debug Configuration 来支持远程调试: - 打开菜单栏中的 **Run -> Edit Configurations...** - 点击左上角的 "+" 号,选择 **Remote** 类型。 - 填入对应的主机名(通常是 IP 地址或域名)和端口号(即前面定义的服务端口),例如: - Host: `localhost` 或者远程机器的实际地址 - Port: `5005` 或者自定义的端口号 - 如果有额外的安全设置或者防火墙规则,请确认允许该端口通信。 完成后点击 Apply 和 OK 完成配置[^4]。 #### 4. 设置断点并开始调试 回到代码编辑窗口,在目标函数的关键位置单击左侧空白区域设置断点。随后返回至刚才建立好的 Remote 调试配置界面,按下绿色三角形旁边的虫子图标启动调试过程。一旦触发条件满足,程序执行将会自动停止于设定处,此时可以通过右侧工具面板查看当前上下文中各变量的状态变化情况。 当一切就绪之后,只需发送 HTTP 请求或其他形式的消息给正在运行的目标应用程序实例,就能观察到预期的效果——IDE 内部展示出对应逻辑流程图样式的视图结构[^2]。 --- ### 示例代码片段演示 假设我们有一个简单的 Spring Boot 应用程序入口类 MainApplication.java 如下所示: ```java @SpringBootApplication public class MainApplication { public static void main(String[] args) throws InterruptedException { SpringApplication.run(MainApplication.class, args); System.out.println("Server started..."); Thread.sleep(10_000); // Simulate some work being done. } } ``` 按照上述指导步骤准备好之后,就可以轻松定位潜在问题所在之处啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值