javascript
Spring Boot 实用开发技巧————Eclipse 远程调试
引言
在之前的開發當中,都會進行本地項目啟動,然后向本地服務發起請求來進行 Debug 調試代碼,這也是開發人員最常見的調試操作。但是當項目逐漸成型,慢慢的將各個模塊部署到服務器后,調試的手段可能就僅僅剩下查看執行日志了。然而和本地 Debug 代碼不同,通過日志排查問題是非常不方便的,你需要在特定的位置打印日志預測問題可能出現的原因,無法精確、快速的定位問題。
為了解決這個問題,JVM 提供了遠程調試的手段。我們在Linux 服務器上啟動項目的時候,為其指定一系列jvm 參數,就可以讓java 服務監聽指定端口,并與本地代碼進行 debug 通信,但一定要保證本地和服務器上的代碼要保持一致。
另外,不是說遠程 Debug 只能用Eclipse ,也并不是說項目類型必須是 Spring Boot 。遠程調試的本質是 JVM 之間的 Socket 通信,因此,只要是 Java 項目就都可以進行類似的遠程調試操作,只不過啟動參數可能書寫的位置不同罷了,而且 IDEA 也是有類似遠程調試的功能的,本篇博客的靈感就來自 IDEA 遠程調試的視頻教程:《DEBUG技巧-遠程調試》
一、項目啟動參數
目前主流的 Spring Boot? 項目都是通過 jar 文件進行啟動的,例如這樣:
nohup java -jar demo.jar &
那么如果想進行遠程調試,啟動參數就必須加上一些允許遠程調試的配置參數:
nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar? demo.jar? &
其中:
-Xdebug 代表開啟debug 模式,允許遠程debug 數據交互
-Xrunjdwp? 代表Java Debug Wire Protocol ,Java Debug 電報協議
transport=dt_socket? 表示以 Socket 方式進行數據傳輸
server=y? 表示啟動的虛擬機是調試的服務器端
suspend=n? 表示不掛起虛擬機,默認是 y ,本參數表示在客戶端建立連接前,服務端是否掛起。n 代表不掛起,即不論我們的客戶機是否進行debug 連接都不必等待直接啟動。
address=8000 表示服務端監聽的客戶機?debug 端口
可以看到,即便是最必要的遠程調試參數也是長長的一串,所以,建議將啟動命令以Shell 腳本的方式存儲,如下所示:
app.sh 腳本文件:
?二、啟動項目
執行配置好遠程 debug 參數的 java -jar 命令后,我們可以通過檢查網絡狀態來觀察對應的端口監聽情況:
使用命令 :
netstat -anp | grep java
目前我只有一個 Java 項目在 CentOS 6 (ip :192.168.1.140)上運行,可以看到兩個醒目的 LISTEN ,代表 8000端口和 8080 端口都已經被 Java 進程監聽。注意,在設置debug 參數的時候我們設置 suspend=n,因此,此時如果不進行 debug 調試的話,服務沒有掛起,因此不會有任何影響,依然可以正常工作。?
三、Eclipse 連接遠程服務
啟動好了服務器上的應用程序,且8000 端口已經被監聽,那么我們只需要在 自己的本機配置遠程調試 IP 和 端口 即可。注意,不論你使用的是不是 Eclipse ,都是有對應的配置的。如果你的遠程主機需要通過跳板機訪問,需要另外配置端口轉發,在文末的注意事項中會提到。
打開 Debug Configuration:
右鍵彈出浮窗,選擇 New Configuration:
填寫必要的連接信息:
點擊 Apply ——> Debug,可以觀察到Eclipse 右下角的提示信息:
雖然這里的進度條信息是 Launching ,但實際上并不代表啟動遠程服務的意思,而是代表啟動本地的客戶機代碼并連接到服務端。連接成功后,Eclipse 界面不會有任何變化,也不會跳轉到 Debug 界面。接下來我們進行一下驗證。
四、遠程調試驗證
又到了驗證環節,剛剛有提到,連接成功后不會有任何提示和變化,那我們如何知道是否連接成功了呢?
首先你可以試著再次連接,那么就會提示下面的彈框:
如果你是人生第一次進行遠程調試,很可能就被這個對話框唬住了,以為自己連接失敗了,我就是這么被騙了好半天。
彈出此對話框的原因是我們已經連接成功了,因此,后面的其他連接都會提示拒絕。
如果將 Eclipse 切換到Debug 界面,可以看到“小紅燈” 和 Disconnect 按鈕都是紅色亮起的狀態,這是第一個可以直觀驗證連接成功的途徑:
第二個驗證的途徑是返回遠程服務器,再次查看網絡監聽狀態:
可以清晰的看到,8000 端口已經由 LISTEN 變為了 ESTABLISHED,由于我的Linux 是放在 VMware 虛擬機上,因此這里顯示的 192.168.1.1 是 NAT 的虛擬網卡,詳情可以參考我的《Linux進階之路————CentOS網絡配置》?
第三個驗證的途徑就是最終我們想要的效果。
我們打開瀏覽器,請求服務器的資源 url ,可以看到我們的本地 斷點成功攔截:
可以看到,我們通過瀏覽器訪問的服務器資源地址,被本地的斷點成功攔截到了請求。
五、注意事項和補充說明
?需要說明的是,服務器上的jar 文件代碼必須要和本地保持一致,否則可能出現調試混亂的情況。
如果服務器開啟了防火墻,那么需要將我們遠程調試的 Debug 端口放行,具體做法可以參考我的《Linux實操———CentOS 6 安裝配置 Tomcat》第三節,簡單來說就是修改?/etc/sysconfig/iptables 文件,照著 22 端口的樣子粘貼即可,然后重啟防火墻。
另外,還有一點需要說明的是,如果在企業中遠程服務器無法直接通信,即可能需要跳板機或者堡壘機訪問,那么可以配置 Debug 端口的端口轉發,可以思考類似的場景:本地的SQLyog 如何連接到受跳板機保護服務器上的MySQL,并參考我的《服務端開發——云服務器的端口轉發設置(SSH隧道)》
注意,遠程Debug模式可以成功將訪問服務器的請求攔截到本地代碼的斷點上,此時本地和遠程的代碼都處于暫停(同步執行)的狀態,即遠程服務會等待開發者執行 Debug 操作,如 Resume(F8)、Step Over(F6) 等。如果希望退出Debug,只需要點擊 Disconnect 按鈕斷開通信即可,點擊后,遠程服務自動向下繼續執行。
注意,一定不要點擊Terminate按鈕,如果只是希望退出?Debug 而誤點了“小紅燈”那么遠程服務也會被終止,需要再次重啟服務才能恢復。
其實只要斷開連接,遠程服務和本地的Eclipse 不會產生任何通信,所有的斷點都不會生效。而一旦連接成功,那么所有本地Debug操作都會被傳送到遠程服務,因此,一定要謹慎操作,避免在不必要的時候使遠程服務停滯或關閉!
遠程Debug 可以反復斷開、重連。?
參考文章
《JDWP了解》
《微服務學習(一)-使用Springboot配合Eclipse遠程調試》
《eclipse遠程調試之springboot》
綜上,是關于遠程調試的一些知識總結,歡迎文末留言。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring Boot 实用开发技巧————Eclipse 远程调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot————静态方法如
- 下一篇: LeetCode算法入门- String