java远程调试

最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPDA了,以下是一些总结。

  什么是JPDA
  Java Platform Debugger Architecture(JPDA:Java平台调试架构) 由Java虚拟机后端和调试平台前端组成
  1.Java虚拟机提供了Java调试的功能
  2.调试平台通过调试交互协议向Java虚拟机请求服务以对在虚拟机中运行的程序进行调试

  JPDA的构架
  JPDA通过两个接口和协议来完成如上的说明,分别是JVMTI(Java虚拟机工具接口)、JDWP(Java调试连线协议)和JDI(Java调试接口)。
  1.JVMTI定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中
    2.JDWP定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制
    3.JDI在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。

  运行方式
  当虚拟机的调试服务运行时,虚拟机作为调试的服务提供端,监听一个连接,而调试器通过该连接与虚拟机进行交互。目前,Windows平台的JVM提供了两种方式的连接:共享内存和 Socket连接,共享内存的服务提供端和调试端只能位于同一台机,而Socket连接则支持不同异机调试,即远程调试。

  虚拟机参数设置
  1.启用调试服务
    -Xdebug 启用调试
    -Xrunjdwp:<sub-options> 加载JVM的JPDA参考实现库
  2.Xrunjdwp子参数(sub-options)配置
    Xrunjdwp子参数的配置格式如下
    -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...

  几个例子
  -Xrunjdwp:transport=dt_socket,server=y,address=8000
  在8000端口监听Socket连接,挂起VM并且不加载运行主函数直到调试请求到达
  -Xrunjdwp:transport=dt_shmem,server=y,suspend=n
  选择一个可用的共享内存(因为没有指address)并监听该内存连接,同时加载运行主函数
  -Xrunjdwp:transport=dt_socket,address=myhost:8000
  连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数
  -Xrunjdwp:transport=dt_shmem,address=mysharedmemory
  通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数
  -Xrunjdwp:transport=dt_socket,server=y,address=8000,
  onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
  等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行
  -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
  等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:\bin\debugstub.exe dt_shmem <address>执行,<address>是可用的共享内存

  启动tomcat
    -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n

    以上两行是tomcat5.5.12的catalina.bat文件中的一句,可以看出tomcat在JPDA方式下是怎么启动的,启动tomcat要用catalina jpda start来启动,不能用startup.bat启动,启动前设置好JPDA_TRANSPORT,JPDA_ADDRESS就OK了

    另有一篇文章http://www.blogcn.com/u2/38/21/ayufox/blog/36956440.html 介绍如何使用Eclipse构建测试平台

<think>好的,我现在需要解决用户关于Java远程调试的问题。首先,用户已经提供了一些参考引用,我需要仔细阅读这些内容,确保回答准确。 用户想知道如何进行Java远程调试的方法和配置教程。根据引用,远程调试主要涉及JVM的启动参数配置和IDE的设置。例如,引用[3]提到启动命令需要添加-Xdebug和-Xrunjdwp参数,而引用[4]说明了IDEA和Eclipse的配置步骤。 我需要先整理步骤,分点说明。首先,JVM的配置,然后IDE的设置。可能还要提到原理,如引用[2]中的JDWP协议,这样用户能理解背后的机制。还要注意用户提到的多人使用问题,如引用[5]提到的只能单用户使用,这点需要提醒。 还要确保使用正确的中文术语,比如“远程调试”、“配置参数”等。同时,注意格式要求,比如行内数学表达式用$...$,但这里可能用不上数学公式,但代码块需要用反引号包裹,并指定语言为python或其他,但用户提供的示例中是Java,所以代码块应该用Java或shell命令。 需要检查是否有遗漏的步骤,例如启动服务时的注意事项,如nohup和挂起选项suspend=y/n的区别。引用[3]中的suspend=n表示不挂起,而如果需要调试启动过程,可能需要设为y。 最后,生成相关问题,如性能影响、安全性、多用户调试等,这些都是用户可能进一步想了解的。要确保问题相关且有价值。</think>### Java远程调试方法与配置教程 Java远程调试通过**JDWP协议**实现,允许开发者通过IDE(如IntelliJ IDEA或Eclipse)调试运行在远程服务器上的Java程序。以下是具体步骤和原理: --- #### 一、JVM启动参数配置 远程调试需要在启动Java程序时添加特定的JVM参数,以启用调试端口: ```shell nohup java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar /xxx.jar & ``` - **`-Xdebug`**:启用调试模式[^3]。 - **`-Xrunjdwp`**:配置JDWP参数: - `transport=dt_socket`:使用Socket通信。 - `address=8000`:指定调试端口。 - `suspend=n`:程序启动后不挂起(`y`表示等待调试器连接后再启动)[^4]。 --- #### 二、IDE配置(以IntelliJ IDEA为例) 1. **创建远程调试配置** - 打开项目后,点击 **Run** → **Edit Configurations** → **+** → **Remote JVM Debug**。 - 填写远程服务器的IP和端口(例如`8000`)[^4]。 2. **启动调试** - 设置断点后,点击**Debug**按钮,IDE会连接到远程JVM。连接成功后,程序运行到断点处会暂停[^4][^5]。 --- #### 三、调试原理 Java远程调试基于**JDWP协议**,通过以下组件实现交互: - **JVM TI**:JVM工具接口,负责调试功能底层实现。 - **JDWP**:定义调试器与JVM之间的通信协议。 - **JDI**:为IDE提供调试接口[^2]。 ![Java调试架构](https://img-blog.csdnimg.cn/20210901164210748.png) --- #### 四、注意事项 1. **网络与安全** - 确保调试端口(如`8000`)在服务器防火墙中开放。 - 避免在生产环境长期开启调试端口,以防安全风险。 2. **单用户限制** JDWP协议仅支持单调试器连接,多人同时调试会冲突。 3. **性能影响** 调试模式会略微增加JVM资源消耗,调试结束后建议关闭[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值