作者:Jan Kratky 來(lái)自:IBM
本文描述了可用于診斷客戶(hù)報告的 Eclipse 插件問(wèn)題的策略。這些策略最強大之處在于能夠將一個(gè)調試會(huì )話(huà)從一個(gè) Eclipse 實(shí)例附加到正在遠程主機上運行的 Eclipse 實(shí)例上。本文中所描述的策略對于基于 Eclipse 2.x 的所有產(chǎn)品都有效,如 WebSphere Studio Application Developer 和 WebSphere Studio Site Developer。
因此,您寫(xiě)了一個(gè) Eclipse 插件,您將它交給了用戶(hù) — 那個(gè)用戶(hù)甚至可能為其支付了費用。該用戶(hù)遲早會(huì )報告問(wèn)題。有時(shí)您只要根據癥狀報告就能夠斷定發(fā)生了什么事。而在其它時(shí)候,錯誤將十分棘手,以至于您需要從用戶(hù)那里獲取更多信息,包括其系統配置,以及確保他實(shí)際正在運行的插件版本是正確的。而在最壞的情況下,您甚至無(wú)法在您的環(huán)境中重現問(wèn)題;您需要直接訪(fǎng)問(wèn)用戶(hù)的機器以真正地了解發(fā)生了什么事。
所幸的是,只要具備少量的工作臺工具知識和訪(fǎng)問(wèn)插件元數據的方法,您就可以診斷客戶(hù)針對插件可能報告的任何問(wèn)題。在本文中,您將看到:
□ 如何獲得客戶(hù)工作臺配置方面的綜合信息,包括所安裝的插件和功能部件,還包括它們每一個(gè)的版本
□ 工作臺錯誤作為日志記錄在哪里
□ 在哪里找到特定于特殊插件的元數據
□ 如何從您自己的工作臺調試客戶(hù)的環(huán)境
工作臺配置
Eclipse 提供了一種簡(jiǎn)單的方法來(lái)抽取一個(gè)正在運行的工作臺實(shí)例的配置細節(另請參閱圖 1):
1. 在工作臺的主工具欄中展開(kāi) Help 菜單。
2. 選擇 About ...(菜單項的文本總是以“About”開(kāi)頭,但還可能包含特定于產(chǎn)品的文本,如“About IBM WebSphere Studio Application Developer”或“About IBM WebSphere Studio Site Developer” — 這都取決于您正在使用的工作臺的特點(diǎn))。
3. 在出現的對話(huà)框中,按 Configuration Details 按鈕。
圖 1. About... 對話(huà)框
在當前透視圖的編輯器區域將打開(kāi)一個(gè)名為“Configuration Details”的文件。該文件含有以下信息:
□ 正在運行工作臺 JRE 的所有 Java 系統特性
□ 已安裝功能部件和插件及各自版本的完整列表
□ 安裝/更新管理器活動(dòng)的日志
□ 工作臺錯誤日志的完整文本
您有時(shí)候可能會(huì )希望客戶(hù)給您發(fā)送整個(gè)日志的副本。幸運的是,將日志保存到文件系統很容易:
1. 確保 Configuration Details 文件在其中打開(kāi)的編輯器位于前面并且具有焦點(diǎn)。
2. 在工作臺的主工具欄中選擇 File 菜單。
3. 選擇 Save Configuration Details As... 菜單項。
在圖 1 中還請注意,在 About... 對話(huà)框中另外兩個(gè)按鈕 Feature Details 和 Plug-in Details 也可用。按其中的任意一個(gè)按鈕,會(huì )出現一個(gè)對話(huà)框,該對話(huà)框中含有插件/功能部件及其版本的表視圖。如果您希望迅速知道是否真的安裝了插件,或者是否安裝的插件為某個(gè)版本,那么您可能希望讓客戶(hù)先檢查一下那些對話(huà)框中的清單,而不是讓他發(fā)送其整個(gè)配置細節文件。
工作臺錯誤日志
錯誤日志按年月日順序(離現在越近的消息越靠近文件尾部)包含工作臺和插件代碼選擇記錄的任何消息和異常。工作臺自動(dòng)將所有未捕獲的異常記錄到錯誤日志中。
錯誤日志的文本包含在我們于前一節中生成的 Configuration Details 文件中。Eclipse 還從 Error Log 視圖提供了錯誤日志的圖形視圖,Error Log 視圖可以在 PDE Runtime 視圖類(lèi)別下找到。(要打開(kāi)視圖,請選擇 Window > Show View)。錯誤日志條目在表中以行的形式出現;最近的條目顯示為第一行。您可以這樣來(lái)查看某個(gè)條目的詳細信息:選擇一行,單擊鼠標右鍵,然后選擇 Properties。在出現的特性對話(huà)框中,特定日志條目的詳細信息位于 Status Details 頁(yè)上。另請參閱圖 2。
圖 2. Error Log 視圖
錯誤日志文件本身作為 .metadata/.log(相對于工作空間 root)駐留在文件系統上。工作空間 root 常常直接位于工作臺安裝目錄中,作為名為 workspace 的文件夾(這是 Eclipse 缺省工作空間位置)。然而,用戶(hù)可以將其工作空間 root 配置為文件系統中的任何文件夾。
插件注冊表
Configuration Details 文件列出了安裝在工作臺實(shí)例中的功能部件和插件。然而,該文件并不指示各個(gè)插件是否是活動(dòng)的。
插件是惰性裝入的 — 即其代碼只有在需要的時(shí)候才裝入內存。這樣,就會(huì )出現這樣一種情形,插件已經(jīng)安裝了,但因為某些原因,它卻沒(méi)有被激活。這表明:要么是在工作臺試圖裝入該插件時(shí)發(fā)生了錯誤,要么只是還沒(méi)有訪(fǎng)問(wèn)插件的功能。
Plug-In Registry 視圖列出了已安裝的插件,并指示每個(gè)插件是否是活動(dòng)的。要打開(kāi)該視圖,請轉向 Window > Show View??梢栽?PDE Runtime 類(lèi)別下找到該視圖。
插件是根據名稱(chēng)排序的(顯示的是名稱(chēng)而不是插件標識)。如果插件圖標的上面放有一個(gè)“runner”圖標,那么該插件是活動(dòng)的。
圖 3. Plug-in Registry 視圖
圖 3 顯示了一個(gè)樣本工作臺安裝的 Plug-in Registry 視圖。請注意,并非所有顯示的插件都是活動(dòng)的,只有那個(gè)名為“Apache Axis”的插件才是活動(dòng)的,其圖標包含“running”修飾。
在激活(或者取消激活)插件時(shí),插件注冊表視圖并不自動(dòng)更新。要檢取插件的當前啟用/禁用狀態(tài),請按視圖標題欄中的 Refresh 按鈕。否則,視圖所反映的仍將是視圖首次顯示時(shí)所存在的事務(wù)狀態(tài)。
插件元數據
插件通常會(huì )維護特定于自己的元數據。該元數據可以采取任何形式:特性文件、XML 文件甚至特有的二進(jìn)制格式。當元數據采用人們可以讀懂的格式時(shí),這對直接查看元數據文件會(huì )很有用。
插件元數據駐留在文件系統的 .metadata/.plugins 目錄(相對于工作空間 root)下。.plugins 目錄內有一些文件夾,它們各自對應一個(gè)插件,以便維護它們自己的元數據。每個(gè)文件夾的名稱(chēng)都與對應插件的標識相同。該插件的元數據應該能夠在文件夾中找到。
插件創(chuàng )建者也可能已經(jīng)選擇了使用插件的缺省 preferences.ini 文件,該文件位于插件的 install 文件夾中。該 install 文件夾將包含插件的標識,并且將位于 plugins 目錄中,安裝就是在該目錄中進(jìn)行的(該目錄通??梢灾苯釉诠ぷ髋_安裝 root 下找到,但請記住,插件安裝位置是可配置的)。
請注意,讓插件在我們剛才描述的位置維護其元數據被認為是工作臺最佳做法。不過(guò),您應該警惕這種可能性,即插件創(chuàng )建者可能選擇不遵循這一約定,而將元數據存儲在其它一些位置,如系統 temp 目錄。
調試遠程工作臺
用于維修 Eclipse 插件代碼的功能最強大的工具是 Eclipse 調試器調試客戶(hù)工作臺的能力,即便客戶(hù)的工作臺運行于遠程機器上也不例外。任何運行工作臺實(shí)例的機器,只要能夠通過(guò)網(wǎng)絡(luò )進(jìn)行訪(fǎng)問(wèn),您都可以使用 Eclipse 安裝的 Debug 透視圖來(lái)調試實(shí)例上所出現的問(wèn)題。遠程工作臺借助開(kāi)放的套接字來(lái)公開(kāi)其調試信息(清單 1 顯示了打開(kāi)調試套接字所需指定的 Eclipse 啟動(dòng)參數)。在將調試器連接到客戶(hù)的工作臺之后,您就可以利用 Eclipse 調試器的全部功能,如設置斷點(diǎn)、檢查變量和執行堆棧等等。(有關(guān)使用 Eclipse Java 調試器的詳盡信息可以在工作臺幫助中獲得,工作臺幫助可以通過(guò)工作臺的 Help > Help Contents 菜單項來(lái)訪(fǎng)問(wèn)。)
重要:工作臺工作空間中的源代碼必須與用來(lái)構建(客戶(hù)安裝的)插件版本的代碼相匹配。在繼續之前,需要確定客戶(hù)所安裝的代碼的級別,并確保您工作空間中的代碼與之匹配。
在確信源代碼處于正確的級別之后,客戶(hù)必須使用下列參數(顯示在清單 1 中)來(lái)啟動(dòng)其工作臺實(shí)例,以啟用到遠程調試器的連接。
清單 1. 啟動(dòng)可遠程調試的工作臺
eclipse.exe -vmargs -Xdebug -Xnoagent \
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
請注意賦給 address 的值,它是一個(gè)端口號,遠程調試器將開(kāi)放該端口供連接使用。在上面的示例參數中,端口號是 8000。要明白,客戶(hù)可能位于防火墻的后面,他可能必須對防火墻進(jìn)行配置,以便您能夠建立套接字連接。
指定 server=y 將表明您剛剛啟動(dòng)的 VM 將等待進(jìn)入的套接字連接。通過(guò)指定 suspend=n,您允許 Java 類(lèi)的執行繼續進(jìn)行。通過(guò)指定 suspend=y(或者完全忽略 suspend 指定,因為 y 是其缺省值),您將告知剛剛啟動(dòng)的 VM:在裝入主類(lèi)之前,您希望它立即暫停。
現在,必須從您的工作臺將調試器連接到客戶(hù)的會(huì )話(huà):
1. 切換到 Debug 透視圖(Window > Open Perspective)。
2. 從主工作臺菜單選擇 Run > Debug...。(或者,從(工作臺工具欄中的)Debug 按鈕上的下拉菜單選擇 Debug...)。
3. 在啟動(dòng)配置對話(huà)框的左側視圖中選擇 Remote Java Application 項。
4. 單擊 New 按鈕。隨后會(huì )創(chuàng )建一個(gè)新的遠程啟動(dòng)配置,并會(huì )顯示三個(gè)選項卡:Connect、Source 和 Common。
5. 在 Connect 選項卡的 Project 域中,輸入或者通過(guò)瀏覽選擇要使用的項目作為啟動(dòng)的參考(用于源碼查找)。對于遠程工作臺調試,您無(wú)須指定項目。
6. 在 Connect 選項卡的 Host 域中輸入正在運行 Java 程序的主機的 IP 地址或域名。如果程序與工作臺運行于同一臺機器上,那么請輸入 localhost。
7. 在 Connect 選項卡的 Port 域中輸入端口,遠程 VM 在該端口上接受連接。在我們的示例中,這個(gè)值為 8000,它匹配使用清單 1 中的參數啟動(dòng)遠程工作臺時(shí)所指定的端口。
8. Allow termination of remote VM 標志是一個(gè)開(kāi)關(guān),它確定調試器中是否支持 Terminate 命令。如果您希望能夠終止目前所連接的 VM,那么請選擇此選項;您一般不需要這么做。
9. 單擊 Debug。啟動(dòng)試圖通過(guò)指定的地址和端口連接到 VM,結果顯示在 Debug 視圖中。如果啟動(dòng)程序無(wú)法通過(guò)指定的地址連接到 VM,那么會(huì )出現一條錯誤消息。
圖 4. 啟動(dòng)連接到遠程工作臺的調試會(huì )話(huà)
現在,您已連接到客戶(hù)的工作臺了??梢砸笥脩?hù)在其工作臺中執行任何您希望的操作,而其工作臺狀態(tài)將反映在調試會(huì )話(huà)中。
在以這種方式進(jìn)行調試的時(shí)候,您可能希望使用遠程控制工具(如由 WinVNC 或 Lotus Sametime 提供的工具)來(lái)直接控制客戶(hù)的桌面,以便您能夠自己在客戶(hù)工作臺上啟動(dòng)操作。
如果檢索到正確級別的代碼,那么您將能夠使用這一技術(shù)來(lái)代替跟蹤機制。Eclipse 提供了一個(gè)優(yōu)秀的跟蹤框架(請參閱參考資料以獲取鏈接),但象所有跟蹤機制一樣,這種跟蹤框架要求將其代碼插入插件源代碼中來(lái)產(chǎn)生跟蹤語(yǔ)句。那些代碼會(huì )有一些性能損失,即便關(guān)閉了跟蹤也是如此,而且它們肯定會(huì )增加代碼資源占用量。而且,您要受開(kāi)發(fā)人員的制約 — 如果在您需要插入跟蹤語(yǔ)句的某個(gè)地方?jīng)]有插入跟蹤語(yǔ)句,那么跟蹤對您將毫無(wú)幫助。然而,有了遠程調試技術(shù),您就不必為之擔憂(yōu)了 — 您擁有完全源代碼級調試的能力。
建議的客戶(hù)服務(wù)過(guò)程
在本文中,您看到了一組用于診斷 Eclipse 插件客戶(hù)問(wèn)題的工具?,F在,如何以最適合于您及您的開(kāi)發(fā)小組的方式使用這些工具就由您決定了。對客戶(hù)服務(wù)過(guò)程的一個(gè)建議是:
1. 如果您無(wú)法光憑錯誤報告來(lái)重現問(wèn)題,那么就叫客戶(hù)把他的配置文件副本發(fā)一份給您。用它來(lái)確保您的插件版本與用戶(hù)的插件版本相同。您還需要仔細檢查錯誤日志以了解“泄密”消息和堆棧跟蹤。
2. 如果問(wèn)題看起來(lái)是個(gè)插件激活問(wèn)題,那么您可能要讓用戶(hù)檢查其插件注冊表視圖來(lái)替您一查究竟。
3. 如果似乎是插件元數據處理方面出了錯誤,或者問(wèn)題特定于用戶(hù)安裝插件的方式,那么就叫用戶(hù)把您認為可能有嫌疑的特定于插件的元數據文件副本發(fā)給您。
4. 如果這些都不奏效,那么請將匹配級別的源代碼裝入您的工作空間,然后遠程調試客戶(hù)的工作臺。
當然,要找到客戶(hù)問(wèn)題的癥結所在,您必須保持靈活,具體問(wèn)題具體分析。
結束語(yǔ)
基于 Eclipse 的工作臺為綜合可服務(wù)性提供了從查看詳細配置信息到對客戶(hù)安裝進(jìn)行實(shí)際代碼級別調試的廣泛功能。