现在的位置: 首页 > 综合 > 正文

jbuilder下无法调试Tomcat的WebApp的问题

2013年12月05日 ⁄ 综合 ⁄ 共 2370字 ⁄ 字号 评论关闭

我用JBuilder8以及JBuilder2005开发Web项目时, 不管使用自带的Tomcat4还是Tomcat5,均无法进入Debug模式, 提示:
-- Cannot start Java debug process VM --

com.sun.jdi.connect.VMStartException: VM initialization failed for: C:/JBuilder2005/jdk1.4/bin/javaw
-classpath
"C:/JBuilder2005/thirdparty/jakarta-tomcat-5.0.27/bin/bootstrap.jar;C:/JBuilder2005/jdk1.4/lib/tools.jar" 
"-Dcatalina.home=C:/JBuilder2005/thirdparty/jakarta-tomcat-5.0.27" 
-Xdebug -Xnoagent -Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,address=suzpcssdgs613:2381,suspend=y
org.apache.catalina.startup.Bootstrap -config
D:/abc/Tomcat/conf/server8080.xml start
Transport dt_socket failed to initialize, rc = 509.

Goolge了一番后,终于找到了原因:

于我的机器上安装了多个JDK,而且在环境变量%PATH%中,
第一个出现的Java路径是"D:/jdk1.5/jre/bin",而JB使用的Java是"C:/JBuilder2005/jdk1.4/bin/
javaw",因而导致了"Connector"的问题.

显然, 解决的方法无非是以下二者之一::
一. 设置Path变量的Java路径, 使之指向JB的Java
二. 设置Jbuilder's JDK路径,使之同Path里面的JDK路径一致 (我的做法). 具体方法:
 a. Tool->Configure->JDK, 把 "D:/jdk1.5" 加进去.
 b.
Project->Project Properties->Run, 依次选择 "Server" runtime
configuration, "Edit", "JDK", use the "specified jdk" , select the
jdk1.5

然后, 启动Debug模式, OK. 从以下的输出可以看出不同(注意下划线部分)
D:/jdk1.5/bin/javaw
-classpath
"C:/JBuilder2005/thirdparty/jakarta-tomcat-5.0.27/bin/bootstrap.jar;D:/jdk1.5/lib/tools.jar" 
"-Dcatalina.home=C:/JBuilder2005/thirdparty/jakarta-tomcat-5.0.27" 
-Xdebug -Xnoagent -Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,address=suzpcssdgs613:2779,suspend=y
org.apache.catalina.startup.Bootstrap -config
D:/abc/Tomcat/conf/server8080.xml start
Mar 15, 2005 11:26:12 AM org.apache.coyote.http11.Http11Protocol init
http://forum.java.sun.com/thread.jspa?threadID=577610&messageID=3025506

问题分析:
Java的调试是通过所谓的JPDA架构(Java Platform Debugger Architecture) 和JDWP协议(Java Debug Wire Protocol), 来实现的. 在JPDA下, 调试器与被调试的VM(Target VM) 通过Transport来通信. Sun实现了两种Transport: 基于Socket的TCP/IP Transport和共享内存的Transport. 基于Socket的方式可以实现跨平台的远程调试, 而共享内存的方式只能在Windows平台下的同一台机器上.
在JPDA下, 调试器通过封装了Transport的Connector来建立同Target VM的连接, 而Target VM上也有一个VM本身内置的封装了Transport的Agent来接受连接.

具体到SUN的VM实现, 为了启动JDWP Agent以被调试, 在运行Target VM的时候需要加入以下参数: -Xdebug(启动Debugging) 和 -Xrunjdwp:(配置Connector)

-Xrunjdwp
需要transport属性指明Connector类型(Socket还是Shared Memory),
server属性指明主动还是被动(server='y', 被动监听Debugger的连接, server='n',
主动连接到Debugger, 默认是'n'), Address属性(当server='y'的时候, 表明监听得端口,
当server=n的时候,表明Debugger的地址.

回到JB的问题上, 对照JB给出的启动调试的命令行参数:-Xrunjdwp:transport=dt_socket,address=suzpcssdgs613:2381 可以知道:JB使用socket方式的Connector启动Tomcat5(org.apache.catalina.startup.Bootstrap), 主动连接到2381端口上的调试器.

抱歉!评论已关闭.