我用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端口上的調試器.