在日常開發中,有時需要對遠程服務器上的應用進行遠程調試,對於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:
- ./catalina.sh jpda start
默認情況下,遠程調試的默認端口為8000,可以通過JPDA_ADDRESS進行配置,指定自定義的端口,另外,還有兩個可以配置的參數
- JPDA_TRANSPORT:即調試器和虛擬機之間數據的傳輸方式,默認值是dt_socket
- JPDA_SUSPEND:即JVM啟動后是否立即掛起,默認是n
可以在catalina.sh中進行配置:
- JPDA_TRANSPORT=dt_socket
- JPDA_ADDRESS=5005
- JPAD_SUSPEND=n
或者通過JPDA_OPTS進行配置:
- JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005’
這樣啟動之后 ,就可以通過Eclise或IDEA進行遠程調試了,IDEA具體如何進行遠程調試,請參考另一篇文章。
網上有很多文章提供了另一種開啟遠程調試功能的方式,即通過JAVA_OPTS指定相應的JPDA參數:
- JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005”
使用這種方式開啟遠程調試功能,在啟動時沒有什么問題,也能夠正常的進行遠程調試,但是在停止tomcat時:
- ./catalina.sh stop
會出現如下錯誤:
- 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掉,所以還是應該使用前面的方式開啟遠程調試功能。