以前看到别人使用调试远程代码感觉好牛逼的样子,前一段时间想学来着,但是由于实际工作中暂时没有用上最终没学会,好悲伤!今天终于需要用了,Google+Baidu了一堆,终于将Windows Tomcat远程调试给学会了,不吹牛逼了,进入正题。
1. 配置windows tomcat服务器端:
rem*******设置Tomcat目录*******--
set CATALINE_HOME=E:\V6.0\ApacheJetspeed
E:
rem 8787为可用端口,为远程调试监听端口--
cd %CATALINE_HOME%/bin
set JPDA_ADDRESS=8787
set JPDA_TRANSPORT=dt_socket
set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787
startup
这段代码的意思是配置Tomcat运行环境来启用
服务器端远程调试功能,这里就必须提到JPDA了(其实我也不太懂,就把其他大牛的博文贴下来了)
******************************************************华丽的分割线******************************************************
原文链接:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/
JPDA 简介
Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构,使您能够在各种环境中轻松调试 Java 应用程序。JPDA 由两个接口(分别是 JVM Tool Interface 和 JDI)、一个协议(Java Debug Wire Protocol)和两个用于合并它们的软件组件(后端和前端)组成。它的设计目的是让调试人员在任何环境中都可以进行调试。JPDA 不仅能够用于桌面系统,而且能够在嵌入式系统上很好地工作。
JVM Tool Interface (JVMTI) 规定必须为调试提供 VM(编辑注:从 Java V5 开始,将用 JVMTI 代替 Java V1.4 中的 JVMDI)。Java Debug Wire Protocol (JDWP) 描述调试信息的格式,以及在被调试的进程和调试器前端之间传输的请求,调试器前端实现 JDI,比如 Eclipse、Borland JBuilder 等。根据 Sun 的 JPDA 规范,被调试的程序常常称为 debuggee。JDI 是一个高级的接口,它定义用于远程调试的信息和请求。下面给出了调试器的架构。
清单 1. Java 平台调试器架构
Components Debugger Interfaces / |--------------| / | VM | debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface \ | back-end | \ |--------------| / | comm channel --( | <------------ JDWP - Java Debug Wire Protocol \ | / |--------------| / | front-end | debugger -----( |--------------| <---- JDI - Java Debug Interface \ | UI | \ |--------------|
因此,任何第三方工具和基于 JPDA 的 VM 应该都能协调工作。通过这个客户机-服务器架构,您可以从运行该平台的本地工作站调试 Java 程序,甚至还可以通过网络进行远程调试。
在讨论调试场景之前,我们先了解 JPDA 规范中的两个术语:连接器和传输。连接器是一个 JDI 抽象,用来在调试器应用程序和目标 VM 之间建立连接。传输定义应用程序如何进行访问,以及数据如何在前端和后端之间传输。连接器 “映射” 到可用的传输类型和连接模式。在 Sun 的 JPDA 参考实现中,为 Microsoft® Windows® 提供了两个传输机制:套接字传输和共享内存传输。可用的连接器:
- 连接套接字连接器
- 连接共享内存连接器
- 监听套接字连接器
- 监听共享内存连接器
- 启动命令行连接器
在调试器应用程序和目标 VM 之间建立连接时,有一端将用作服务器并监听连接。随后,另一端将连接到监听器并建立一个连接。通过连接,调试器应用程序或目标 VM 都可以充当服务器。进程之间的通信可以在同一个机器或不同的机器上运行。
要远程调试 Java 程序,难点不是在调试器的前端,而是远程 Java 后端。不幸的是,Eclipse 帮助系统中为这方面提供的信息并不多。事实上,JDI 和 JVMTI 是分别由 Eclipse 和 Java 运行时环境实现的。我们仅需要考虑 JDMP,因为它包含与 JVMTI 和 JDI 进行通信所需的信息。JDWP 包含许多参数,用于为远程 Java 应用程序调用所需的程序。以下是本文用到的一些参数。
-
-Xdebug
- 启用调试特性。
-
-Xrunjdwp:<sub-options>
- 在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。
从 Java V5 开始,您可以使用 -agentlib:jdwp 选项,而不是 -Xdebug 和 -Xrunjdwp。但如果连接到 V5 以前的 VM,只能选择 -Xdebug 和 -Xrunjdwp。下面简单描述 -Xrunjdwp 子选项。
-
transport
- 这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。
-
server
- 如果值为 y,目标应用程序监听将要连接的调试器应用程序。否则,它将连接到特定地址上的调试器应用程序。
-
address
- 这是连接的传输地址。如果服务器为 n,将尝试连接到该地址上的调试器应用程序。否则,将在这个端口监听连接。
-
suspend
- 如果值为 y,目标 VM 将暂停,直到调试器应用程序进行连接。
要获得每个调试设置的详细解释,请参考 JPDA 文档(参见 参考资料)。
清单 2 是一个示例,显示如何在调试模式下启动 VM 并监听端口 8765 的套接字连接。
清单 2. 作为调试服务器的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765
清单 3 显示如何使用位于 8000 端口的主机 127.0.0.1 上的套接字连接运行中的调试器应用程序。
清单 3. 作为调试客户机的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000
2. 配置Eclipse远程调试:
2.1 Debug ->Debug Configurations;
2.2 硬菜来了:
2.3 Debug
3. 总结:
如果不想了解太多的话,我建议
3.1. 只需要将第一步的脚本复制下来保存到一个.bat文件中;
3.2 按照如图在Eclipse中配置
4. 注意:
4.1 脚本中的E:是为了切换到CATALINE_HOME目录中(可不要犯低级错误哦);
4.2 演示的【端口:8787】记住为空闲端口,可以任意修改;
4.3 可以使用命令:netstat -ano | findstr 8787检测JPDA监听端口是否正常开启;
4.4 连接远程主机时若无法连接远程连接,很有可能是服务器防火墙屏蔽了,window7环境配置端口过滤如下图: