遠程調試是 Java 開發中不可或缺的技能,特別適用於:生產環境問題排查、嵌入式/行動裝置開發、無法安裝 IDE 的伺服器環境。本文基於 Eclipse (Ganymede/V3.4+) 與 JPDA 架構,詳細講解 Socket Attach 與 Socket Listen 兩種連線模式的配置與實戰操作。
Java Platform Debugger Architecture (JPDA) 採用客戶端-伺服器模型:
通訊雙方透過「連接器」建立連線,傳輸層支援 Socket 或 Shared Memory(Windows)。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=y
| 參數 | 說明 |
|---|---|
| transport | dt_socket(網路通訊)或 dt_shmem(Windows 共享記憶體) |
| server=y/n | y:目標 JVM 為 Server 監聽端口;n:目標 JVM 主動連接調試器 |
| address | IP:Port,server=y 時為監聽端口;server=n 時為調試器地址 |
| suspend=y/n | y:JVM 啟動後暫停等待調試器連接;n:立即執行 |
Java 5+ 建議使用 -agentlib:jdwp=... 替代 -Xdebug -Xrunjdwp。
目標 JVM = Server,Eclipse = Client
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar app.jarRun > Debug Configurations > Remote Java Application 新建配置Allow termination of remote VM 可從 Eclipse 終止遠程進程Eclipse = Server,目標 JVM = Client
waiting for vm to connect at port 8000...java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar app.jarWindow > Preferences > Java > Compiler 勾選「Add variable attributes」與「Add line number attributes」。package com.ibm.developerWorks.debugtest;
public class test {
public static void main(String[] args) {
System.out.println("This is a test."); // 在此行設斷點
}
}
Debug As > Java Application 驗證斷點生效。Export > Runnable JAR 產生 test.jar。掌握 server=y/n 與 suspend=y/n 的組合,靈活選擇 Attach 或 Listen 模式,即可應對從本地開發到生產環境、嵌入式裝置的各種遠程調試場景。Eclipse 強大的 JDI 實作讓遠程調試體驗幾乎等同本地。