在日常開發中,有時需要對遠端伺服器上的應用進行遠端調試,對于tomcat,要進行遠端調試其實很簡單,隻需要在啟動tomcat時開啟jpda服務即可。
什麼是JPDA呢?
JPDA(Java Platform Debugger Architecture) 是 Java 平台調試體系結構的縮寫,通過 JPDA 提供的 API,開發人員可以友善靈活的搭建 Java 調試應用程式。JPDA 主要由三個部分組成:Java 虛拟機工具接口(JVMTI),Java 調試線協定(JDWP),以及 Java 調試接口(JDI)。而像Eclipse和IDEA這種開發工具提供的圖形界面的調試工具,其實就是實作了JDI。關于JPDA的詳細資訊,可以檢視developerWorks上的系列文章——深入Java調試體系
tomcat使用如下方式進行啟動jpda:
[plain] view plain copy
- ./catalina.sh jpda start
預設情況下,遠端調試的預設端口為8000,可以通過JPDA_ADDRESS進行配置,指定自定義的端口,另外,還有兩個可以配置的參數
- JPDA_TRANSPORT:即調試器和虛拟機之間資料的傳輸方式,預設值是dt_socket
- JPDA_SUSPEND:即JVM啟動後是否立即挂起,預設是n
可以在catalina.sh中進行配置:
[plain] view plain copy
- JPDA_TRANSPORT=dt_socket
- JPDA_ADDRESS=5005
- JPAD_SUSPEND=n
或者通過JPDA_OPTS進行配置:
[plain] view plain copy
- JPDA_OPTS=\'-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005’
這樣啟動之後 ,就可以通過Eclise或IDEA進行遠端調試了,IDEA具體如何進行遠端調試,請參考另一篇文章。
網上有很多文章提供了另一種開啟遠端調試功能的方式,即通過JAVA_OPTS指定相應的JPDA參數:
[plain] view plain copy
- JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005”
使用這種方式開啟遠端調試功能,在啟動時沒有什麼問題,也能夠正常的進行遠端調試,但是在停止tomcat時:
[plain] view plain copy
- ./catalina.sh stop
會出現如下錯誤:
[plain] view plain copy
- ERROR: transport error 202: bind failed: Address already in use
- ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
- JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]
- FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
導緻不能正常終止java程序,需要手動的kill掉,是以還是應該使用前面的方式開啟遠端調試功能。
來源:http://blog.csdn.net/mhmyqn/article/details/49209541