遠程調試,你值得擁有

1. 簡單理解

  遠程調試就是用本地的代碼調試服務器上的代碼,稍微想一想怎麼能作到呢,確定是本地和遠程服務上的虛擬機之間實現了相互通信啊.。術語話一點,就是本地和遠程的JVM之間基於某種協議(debug協議)以套接字(socket) 的方式實現通訊,從而實如今本地遠程調試服務端代碼的功能。既然是以套接字的方式,那可定就有服務端和客戶端的概念。這裏不要思惟定勢了,所謂服務端和客戶端是相對的,並非說你部署服務的遠程端才叫服務端,實際上,只要你喜歡,你能夠將本地IDE配置成服務端,讓遠程服務啓動後來主動鏈接本地,固然,一般的方式仍是順勢思惟,就把遠程配置爲socket的服務端,監聽客戶端;並且鏈接的創建都是服務端先啓動後監聽特定端口,等待客戶端鏈接。java

3. 命令環境

  在運行java -jar命令來啓動的項目如內嵌服務器(如Jetty)或者只是簡單的運行 main 方法的場景下,想要遠程調試,也很簡單,就是在啓動時添加遠程調試相應的參數,下面爲博主測試jar包環境下配置參數,徹底能夠拿去即用的——    瀏覽器

java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=9999,suspend=n -jar debug.jar

  參數釋疑:服務器

    -XDebug                 啓用調試模式;
    -Xrunjdwp               加載JDWP的JPDA參考執行實例;
    transport                 用於在調試程序和 JVM 使用的進程之間通信;
    dt_socket                以套接字方式傳輸;
    server=y/n              是否支持在server模式的虛擬機中(java -version能夠查看到虛擬機默認運行模式,但布衣博主發現沒有此參數也不影響調試,此條存疑);
    address=9999        調試服務端監聽的端口號,若是是做爲調試客戶端,須要加上IP地址,形如: java -Xdebug -Xrunjdwp:transport=dt_socket,address=192.168.1.100:9999,suspend=n -jar debug.jar 
    suspend=y/n          是否在調試客戶端創建鏈接以後啓動 JVM,設置爲y程序啓動會阻塞,直到客戶端創建鏈接程序纔會正式啓動,爲 n 程序直接啓動eclipse

  本地 Idea配置和服務啓動以下圖:socket

      

    

 

  本地和遠程服務創建調試鏈接後,若是代碼中打有斷點,在本地瀏覽器中訪問服務器地址,就能夠愉快的在本地查看服務器端代碼的運行狀況了——測試

    

  注意:調試過程必定保證本地代碼和服務代碼的一致性,不然本地看到的運行軌跡會讓你莫名其妙。spa

  附:eclipse中經過 run -> Debug Configurations -> Remote Java Application一樣的配置便可。debug

3.容器環境

  這裏還要說更經常使用以Tomcat做爲服務器運行項目的情景,有些教程說要在啓動腳本如startup.sh或catalina.sh 中配置調試參數等等,其實不用的,真的不用的,由於咱們的 Tom 貓已經把調試參數配置好了的,在它的啓動腳本catalina.sh(startup.sh最終也是調用該啓動腳本)中你能夠看到以下腳本代碼:  3d

  

 

  因此,開啓遠程調試就很簡單了,直接 運行  ./catalina.sh jpda start  啓動,默認監聽 8000 端口便可開啓遠程,你能夠經過  lsof -i:8000  或  netstat -lnp | grep 8000 等查看端口占用狀況,也能夠在Tomcat的啓動日誌中查看監聽的端口。調試

             

   啓動後,IDE端的配置就和博文上面演示的是同樣的了,本身愉快的玩耍吧。

相關文章
相關標籤/搜索