天天看點

Java遠端調試 Eclipse/IDEA

一、模拟用戶端源碼

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列印消息如下:

Java遠端調試 Eclipse/IDEA

四、配置并啟動本地attach debugger

本步驟也是實作遠端調試的關鍵。

這裡需要說明的是第三部分和第四部分的ServerMain代碼是同一份代碼。

配置調試本地伺服器程式ServerMain的debugger:

eclipse配置如下:

Java遠端調試 Eclipse/IDEA

IntelliJ IDEA配置參考如下:

Java遠端調試 Eclipse/IDEA

啟動本地debugger的方式,和本地調試程式方式一樣,可以在需要調試的地方打斷點,當本地debugger運作到該斷點時,會把遠端Target JVM該部分的運作資訊請求并列印出來,這樣就達到了遠端調試的目的。

當啟動本地debugger時,遠端Target JVM列印資訊如下:

Java遠端調試 Eclipse/IDEA

五、啟動用戶端程式

啟動用戶端程式,用戶端程式會請求本地伺服器ServerMain的debugger,由于本地debugger已經attach到遠端Target JVM,本地debugger可以把遠端Target JVM的運作狀态資訊列印出來,例如變量的值等。

用戶端程式啟動後,遠端Target JVM列印資訊如下:

Java遠端調試 Eclipse/IDEA