Eclipse遠程調試出現“JDWP Transport dt_socket failed to initialize”的解決方案


歡迎關注我的社交賬號:

博客園地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju

工作中經常需要使用Eclipse遠程連接Tomcat,調試Web應用程序,關於如何進行遠程調試,本文不再贅述,可以參考下面的文章:

eclipse遠程調試Tomcat方法:http://blog.csdn.net/afgasdg/article/details/9236877

但是按照上面的方法進行操作可能會有一些小問題,在遠程服務器中更改Tomcat的配置文件catalina.sh之后第一次重啟Tomcat時,一般是沒有問題的(注意設置的DEBUG端口號不要和其它已有應用端口號沖突),但是在之后的重啟過程中可能會出現下面的問題:

cd tomcat/bin
./shutdown.sh ; ./startup.sh ; tailf ../logs/catalina.out

ERROR: transport error 202: bind failed
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:690]
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)

之所以出現這個問題,主要是因為,我們添加的DEBUG端口在關閉Tomcat時不能正常關閉,重啟時又會重新開啟,所以端口被占用,我們可以在關閉Tomcat之后利用下面的命令進行驗證會發現,仍然有進程在占用着DEBUG端口。

lsof -i:44121(或者 netstat -na|grep 44121)

這個其實就是我們自己之前開啟的。當然我們可以在每次shutdown之后手動kill掉這個進程,但是終歸不是解決之道。我現在想到的比較好的方法是在catalina.sh中配置DEBUG端口時,把需要添加的那一行添加到start條件的開始處:

...
elif [ "$1" = "start" ] ; then
CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
...

並且在stop條件的開始處把DEBUG端口干掉

...
elif [ "$1" = "stop" ] ; then
debug_pid=`lsof -i:44121 | tail -n 1 | awk -F" " '{print $2}'`
kill -9 ${debug_pid}·
...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM