一、模拟用戶端源碼
package testR;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class TestMain {
public static void main(String[] args) {
try {
Socket cs = new Socket("127.0.0.1", );
OutputStream os = cs.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("test server invoke");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、模拟伺服器源碼
package testR;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerMain {
public static void main(String [] args){
System.out.println("server started!");
try {
ServerSocket ss = new ServerSocket();
Socket cs = ss.accept();
InputStream is = cs.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String para = br.readLine();
System.out.println("request received: para is : " + para);
serverMethod(para);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("server stopped!");
}
public static void serverMethod(String para){
System.out.println("Server receive " + para);
}
}
三、啟動遠端Target JVM
本步驟是實作遠端調試的關鍵。
假設我們要遠端調試第二部分的伺服器程式ServerMain,執行如下指令,啟動遠端Target JVM:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6789 testR/ServerMain
指令中參數的詳細說明參見博文Java 遠端調試參數說明。
遠端Target JVM列印消息如下:
四、配置并啟動本地attach debugger
本步驟也是實作遠端調試的關鍵。
這裡需要說明的是第三部分和第四部分的ServerMain代碼是同一份代碼。
配置調試本地伺服器程式ServerMain的debugger:
eclipse配置如下:
IntelliJ IDEA配置參考如下:
啟動本地debugger的方式,和本地調試程式方式一樣,可以在需要調試的地方打斷點,當本地debugger運作到該斷點時,會把遠端Target JVM該部分的運作資訊請求并列印出來,這樣就達到了遠端調試的目的。
當啟動本地debugger時,遠端Target JVM列印資訊如下:
五、啟動用戶端程式
啟動用戶端程式,用戶端程式會請求本地伺服器ServerMain的debugger,由于本地debugger已經attach到遠端Target JVM,本地debugger可以把遠端Target JVM的運作狀态資訊列印出來,例如變量的值等。
用戶端程式啟動後,遠端Target JVM列印資訊如下: