前言:
我們在開發的過程中,難免會遇到調用別人機器上的代碼,或者測試服務器上的代碼。再調用過程中,難免會用到斷點調式的功能。但是運行的不是本地的代碼怎么辦呢?
現在我們就來了解下Java遠程斷點調用。
需要:
本地必須有源碼,才能進行遠程斷點。
一. 服務端啟動
#jdk1.7版本之前的命令
#java -agentlib:jdwp=transport=dt_socket,address=9092,server=y,suspend=y -jar xxx.jar
#1.7版本之后的命令
#1) java -agentlib:jdwp=transport=dt_socket,address=9092,server=y,suspend=y -jar xxx.jar
#2) java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9092-jar xxx.jar
我本地是jdk1.8,所以:
# nohup 末尾加&是后台運行 后邊是日志輸出路徑
nohup java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=9092,suspend=y -jar xxx.jar 1>/home/project/applogs/xxx-standout.log 2>&1 &
參數說明:
# -Xdebug:通知JVM工作在debug模式下;
# -Xnoagent 禁用默認sun.tools.debug調試器。
# -Djava.compiler=NONE 禁止 JIT 編譯器的加載。
# -Xrunjdwp:通知JVM使用(java debug wire protocol)來運行調試環境;加載JDWP的JPDA參考執行實例
# transport:監聽Socket端口連接方式(也可以dt_shmem共享內存方式,但限於windows機器,並且服務提供端和調試端只能位於同一台機);
# server:server=y表示當前是調試服務端,=n表示當前是調試客戶端
# suspend:suspend=n表示啟動時不中斷,一般用於設置主動連接;suspend=y表示啟動時就進入調試模式,一般用於被動連接;
二. 客戶端調用
用idea連接遠程代碼
1.
2.
3.
4.啟動remote,當 console 窗口中打印出 “Connected to the target VM, address: 127.0.0.1:9092', transport: 'socket'”即表示鏈接成功
然后就可以訪問頁面,再本地代碼打斷點了
注意:
1.服務端啟動的時候,address=prot 這個端口號和程序端口,不是一樣的。address這個端口號,必須要是沒有在使用的。
2.服務端,不但要開放程序端口,而且要開放address端口。剛開始的時候,可以把防火牆關了練習。
3.客戶端,調用的時候,調用的不是程序端口,而是address端口。