標籤:eclipse java 虛擬機器 遠端偵錯 linux
今天定位Linux Server端的Java應用程式的問題,使用了 Eclipse 遠端偵錯 Java 應用程式,這恐怕是定位Server端最常見也是最根本的方法,居然至少有兩位有好幾年開發經驗的同事都不知道這個方法,我也感覺十分詫異。
本文在介紹使用Eclipse遠端偵錯Java應用程式之外,著重解析了遠端偵錯的原理。
JVM原理
眾所周知,Java由於引入了虛擬機器JVM,擁有了很好的跨平台和安全性,.java檔案由Javac編譯成.class檔案也叫位元組碼檔案,位元組碼檔案由JVM執行,並由翻譯器翻譯成各個機器認識的不同的機器碼(0101010010101),這樣,JVM支援了Java 的跨平台性。
遠端偵錯的應用情境
遠端偵錯很有用,特別是當你的開發環境在Window,又在遠端Linux Server或者移動平台上運行Java應用程式,Java提供了一系列的介面和協議讓本地Java檔案於遠端JVM建立聯絡和通訊。
調試器架構
根據 Sun 的 JPDA 規範,用於調試的程式常常被稱為debugger, 而被調試的程式稱為 debuggee,下面圖1給出了調試器的架構。
Components Debugger Interfaces / |--------------| / | VM | debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface \ | back-end | \ |--------------| / | comm channel --( | <------------ JDWP - Java Debug Wire Protocol \ | / |--------------| / | front-end | debugger -----( |--------------| <---- JDI - Java Debug Interface \ | UI | \ |--------------|
圖1. Java 調試器架構
這個架構從下往上讀,大致可以解讀為: 用於調試的程式使用UI,通過Protocol,調用遠端JVM進程。
其實質還是JVM,因此,只要確保本地Java 原始碼與目標應用程式一致,本地的Java源碼就可以用socket串連到遠端的JVM,進而執行調試。因此在這種Socket Attach模式(下文介紹)下,本地只需要有源碼,Java應用程式根本不用啟動。
兩種方式進行遠端偵錯圖2描述了遠端偵錯的兩種方式 - 上面的表示Eclipse配置為Socket Listen方式,下面的是Socket Attach方式
圖2. 遠端偵錯的兩種方式
使用Eclipse遠端偵錯Java
Eclipse配置: 菜單(Eclipse): Run-->Debug Configurations 開啟調試配置面板,配置
注意,如果 Java 原始碼與目標應用程式不匹配,調試特性將不能正常工作。
選擇 Allow termination of remote VM 選項 可以在應用程式調試期間終止串連,如:
這樣遠端偵錯串連上之後,就可以像在本地調試Java程式一樣來調試遠端的Java應用程式。
結束語
將以上Socket Attach遠程debug 方法多用於實際項目中,使用過程中多思考一下其中的原理,這樣很多次實踐之後便會對此功能有自己的理解了 :)
使用Eclipse遠端偵錯及原理