概述
對於分佈式系統的調試不知道你們有什麼好的方法。對於我來講,在知道遠程調試這個方法以前就是在代碼中打各類log,而後從新部署,上線,調試,這樣比較費時。今天我們來了解了解Java遠程調試這個牛逼的功能,本文以Intellij IDEA爲例講解怎麼使用遠程調試。以Thrift入門教程這篇文章中使用的程序做爲例子。這個程序由Thrift服務端和客戶端組成。描述一下遠程調試須要解決的問題:html
服務端程序運行在一臺遠程服務器上,咱們能夠在本地服務端的代碼(前提是本地的代碼必須和遠程服務器運行的代碼一致)中設置斷點,每當有請求到遠程服務器時時可以在本地知道遠程服務端的此時的內部狀態。java
下面按照步驟介紹怎麼遠程debug。spring
使用特定JVM參數運行服務端代碼
要讓遠程服務器運行的代碼支持遠程調試,則啓動的時候必須加上特定的JVM參數,這些參數是:bash
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中的${debug_port}是用戶自定義的,爲debug端口,本例以5555端口爲例。服務器
配置步驟
1.本地idea配置
打開Intellij IDEA,在頂部靠右的地方選擇」Edit Configurations…」,進去以後點擊+號,選擇」Remote」,按照下圖的只是填寫紅框內的內容,其中host爲遠程代碼運行的機器的ip/hostname,port爲上一步指定的debug_port,本例是5555
app
而後點擊Apply,最後點擊OK便可socket
注:其中host爲遠程服務器地址 Port爲自定義端口分佈式
保留JVM參數(服務器配置時使用)ide
或
idea
2.服務器配置
修改啓動腳本(start.sh)--田間JVM參數
nohup /usr/java/jdk1.8.0_40/bin/java -jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y Appserver.jar --spring.config.locaton=./application.yml --logging.config=./logback.xml &
說明一下DEBUG選項參數的意思:
-XDebug 啓用調試
-Xrunjdwp 加載JDWP的JPDA參考執行實例。
transport 用於在調試程序和 VM 使用的進程之間通信。
dt_socket 套接字傳輸。
server=y/n VM是否須要做爲調試服務器執行。
address=2345調試服務器監聽的端口號。
suspend=y/n 是否在調試客戶端創建鏈接以後啓動 VM 。
注:還有一個細節是-jar參數不能寫到-Xug參數前,像這樣沒法啓用調試(如圖)
java -jar Appserver.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y
![](http://static.javashuo.com/static/loading.gif)
3.idea啓動debug模式
如今在上一步選擇」Edit Configurations…」的下拉框的位置選擇上一步建立的remote的名字,而後點擊右邊的debug按鈕(長的像臭蟲那個),看控制檯日誌,若是出現相似「Connected to the target VM, address: ‘xx.xx.xx.xx:5555’, transport: ‘socket’」的字樣,就表示鏈接成功過了。
設置斷點,開始調試
遠程debug模式已經開啓,如今能夠在須要調試的代碼中打斷點了,好比:
如圖中所示,若是斷點內有√,則表示選取的斷點正確。
如今在本地發送一個到遠程服務器的請求,看本地控制檯的bug界面,劃到debugger這個標籤,能夠看到當前遠程服務的內部狀態(各類變量)已經所有顯示出來了,而且在剛纔設置了斷點的地方,也顯示了該行的變量值。
參考
https://blog.csdn.net/helllochun/article/details/40890277
https://www.cnblogs.com/wy2325/p/5600232.html
idea2019:
https://www.cnblogs.com/virgosnail/p/10560738.html