Java远程调试Tomcat应用程序:为什么JVM不听?

12
我想远程调试运行在Tomcat 7上的应用程序。Tomcat是作为一个Windows Server 2008服务运行的。 我在Tomcat的Java配置面板的Java选项中添加了以下内容:-Xdebug -Xrunjdwp:transport=dt_socket,address=4711,server=y,suspend=n并打开了我的工作站和服务器防火墙上的此端口。 但是,当我尝试从我的工作站上的IntelliJ 9进行调试时,出现错误消息Unable to open debugger port : java.net.ConnectException "Connection timed out: connect"。jvm是标准的Sun/Oracle 64位JVM版本1.6.0_27。
我通过访问已部署到Tomcat的应用程序并将结果记录到日志文件中的ManagementFactory.getRuntimeMXBean().getInputArguments()来验证命令行参数正在使用。 我通过Wireshark在我的工作站和服务器上验证,TCP请求在端口4711上从我的计算机发送并到达服务器,但没有答案。在服务器上运行netstat -a不显示在此端口上侦听的进程。因此,我假设Tomcat/JVM未启动远程调试。

2
你是否使用jpda开关启动tomcat?例如:catalina jpda start - pabrantes
不需要,我需要这样做吗? - FrankPl
1
是的,使用JPDA开关启动catalina可以让tomcat知道您想要使用调试选项启动。此外,我注意到您想要将地址定义为4711(而不是默认的8000),因此请记住必须将环境变量JPDA_ADDRESS定义为4711。通过这些修改,您将能够附加到tomcat进行调试。 - pabrantes
我该怎么做?在通过托盘图标弹出的Tomcat配置GUI中将“start”的值更改为“jpda start”,会导致服务无法启动,并显示消息“Bootstrap:命令“jpda start”不存在。” - FrankPl
不,您不需要使用jdpa。如果您阅读文档(http://wiki.apache.org/tomcat/FAQ/Developing#Q1),您会发现使用`catalina jpda start`启动服务是一种简写方式,如果您正在使用shell脚本,而不是使用服务包装器,则不需要这样做。 - Mikkel Løkke
1个回答

29

您需要将 -Xdebug 和 -Xrunjdwp... 分别放在 Tomcat 服务配置面板中 Java 面板的不同行上。

因此,您需要这样设置:

-Xdebug

-Xrunjdwp...

-Xdebug -Xrunjdwp:transport=dt_socket,address=4711,server=y,suspend=n

不能工作,但是:

-Xdebug
-Xrunjdwp:transport=dt_socket,address=4711,server=y,suspend=n

将会。


1
那就是解决方案!谢谢你! - FrankPl
我将此添加到 Linux 上的“serverenv.sh”下。 - Marcello DeSales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接