翻譯文章網(wǎng)址:
http://www.jacoozi.com/index.php?option=com_content&task=view&id=119&Itemid=134
試圖修復(fù)服務(wù)器端的Java問題,花費(fèi)大量時間獲取問題源的經(jīng)歷不知道發(fā)生了多少次?調(diào)試器可以顯著地縮短錯誤發(fā)現(xiàn)時間而且使調(diào)試過程更加變得享受。這篇文章將探索如何在Eclipse中使用遠(yuǎn)程調(diào)試器。
文章內(nèi)容:
Java調(diào)試器
調(diào)試Weblogic
調(diào)試IBM WebSphere 5.x/6.x
調(diào)試JBoss
在JBoss中熱交換代碼
調(diào)試Tomcat
調(diào)試JSP頁面
調(diào)試器驗證
參考
系統(tǒng)信息
Java調(diào)試器
Java調(diào)試器(jdb)是一個動態(tài)的,可控的,基于任務(wù)的調(diào)試工具。它幫助找到并修復(fù)本地的和服務(wù)器端的Java語言的臭蟲。為了在J2EE應(yīng)用服務(wù)器中使用jdb,首先必須讓eclipse中的調(diào)試成為可用,而且將通過JPDA端口(默認(rèn)端口是1044)的調(diào)試和服務(wù)器關(guān)聯(lián)在一起。
J2EE服務(wù)器缺省的JPDA選項如下:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
Jdb參數(shù)指定調(diào)試器操作方式。例如transport=dt_socket告訴JVM調(diào)試器將會通過socket連接,然而address=1044通知端口號是1044.類似地,如果你設(shè)置suspend=y,JVM將會以掛起模式(suspended mode)啟動,保持掛起狀態(tài)直到調(diào)試器關(guān)聯(lián)上它。如果想一啟動JVM就想啟動調(diào)試,那么這將是有幫助的。
調(diào)試Weblogic
調(diào)試Weblogic和調(diào)試其他Java遠(yuǎn)程應(yīng)用沒有什么區(qū)別。需要確保啟動Weblogic時設(shè)置了必須的調(diào)試參數(shù),而且連接了調(diào)試器。就Weblogic8.1來說,需要增加下列參數(shù)在啟動腳本中。Weblogic提供多個啟動腳本(*.sh和*.cmd),腳本位置在BEA_HOME/weblogic81/server/bin目錄下。
1. 找到startWSL.cmd并且增加下列變量DEBUG_OPTS:
set DEBUG_OPTS = -Xdebug -Xrunjdwp:transport= dt_socket,address=1044,server=y,suspend=n
2. 接下來,插入新變量在Weblogic啟動命令中,放在"%JAVA_HOME%\bin\java"后和其他參數(shù)前。
3. 啟動腳本類似于下面的腳本:
"%JAVA_HOME%\bin\java" %DEBUG_OPTS% %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS%-Dweblogic.Name=%SERVER_NAME% -Dweblogic.management.username= %WLS_USER%-Dweblogic.management.password= %WLS_PW% -Dweblogic.management.server= %ADMIN_URL%-Dweblogic.ProductionModeEnabled= %PRODUCTION_MODE%-Djava.security.policy= "%WL_HOME%\server\lib\weblogic.policy" weblogic.Server
調(diào)試IBM WebSphere 5.x/6.x
1. 打開WebSphere 5.X/6.X控制臺
2. 打開Servers | Application Servers | [SERVERNAME] | Process Definition | Java Virtual Machine
3. 注冊Debug Mode

4. 在Debug arguments域中編輯參數(shù)。可以粘貼下面的的代碼,使用相同的1044端口從eclipse調(diào)試:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
調(diào)試JBoss
除了需要修改JBOSS_HOME/bin下的run.bat/run.sh外,其他和WebLogic相同。
Linux用戶可以看到類似于如下的配置:
$ cd /var/jboss4/bin
$ sh ./run.sh
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /var/jboss4
JAVA: /usr/java/j2sdk1.4.2_06/bin/java
JAVA_OPTS: -server -Xms128m -Xmx128m -Dprogram.name=run.sh
DEBUG_OPTS = -Xdebug -Xrunjdwp:transport= dt_socket,address=1044,server=y,suspend=n
CLASSPATH: /var/jboss4/bin/run.jar:/usr/java/j2sdk1.4.2_06/lib/tools.jar
=========================================================================
JBoss中的熱交換代碼(Hot Swapping Code)
假如JBoss根目錄在C:\JBoss,應(yīng)用程序的classpath是C:\classes\myapp。通過設(shè)置這個目錄為項目輸出目錄來告訴Eclipse編譯應(yīng)用程序到這個目錄下。這樣基本上可以工作了,但是有點隱患。
如果每次都使用Ant腳本來build-clean,或許想確保輸出目錄的內(nèi)容不要偶然地被Eclipse清除掉。由于Eclipse有項目的清除功能,這種功能能容易重?fù)粽麄€目錄從而僅僅得到類文件。為此,為了保持Ant生成的文件和Eclipse將生成的*.class文件在一起,你必須告訴Eclipse你的輸出目錄。
1. 首先設(shè)置Java項目輸出目錄。假設(shè)JBoss應(yīng)用程序的classpath在Eclipse工作空間之外,這樣設(shè)置一個鏈接的目錄將是個不錯的選擇。
2. 打開File | New | Folder。
3. 輸入classes作為目錄名字,點擊Advanced,指定新目錄為C:\classes\myapp。

4. 在項目屬性頁,修改輸出目錄為新創(chuàng)建的classes目錄。點擊Project | Properties | Java Build Path,在Default output foder中寫入如下值。

5. 打開Window | Preferences... | General | Workspace,選中Build automatically。

6. 最后,告訴Eclipse不要每次編譯項目的時候刪除輸出目錄的其他文件。依然在Preferences中打開Java | Compiler | Building,不要選中Scrub output folders when cleaning projects。這就是說,現(xiàn)在每次你保存Java文件,Eclipse會重新編譯它而且JBoss也會重新加載它。

調(diào)試Tomcat
調(diào)試Tomcat非常類似于Weblogic和JBoss,但是需要修改TOMCAT_HOME/bin下的catalina.bat/catalina.sh文件。
Tomcat是一個特殊的情況,因為它能夠調(diào)試和發(fā)布置換熱代碼(hot code)。
在Eclipse中使用Sysdeo Tomcat Plugin
Sysdeo是Eclipse下小而強(qiáng)大的Tomcat插件。和其他插件一起使用Sysdeo將會讓你調(diào)試Tomcat和重新加載上下文。
1. 首先從Sysdeo網(wǎng)站下載插件
2. 解壓文件到ECLIPSE_HOME/plugins目錄
3. 啟動Eclipse,打開Window | Preferences... | Tomcat.
4. 在插件參數(shù)頁,指定Tomcat版本和主目錄。在Tomcat中有兩種聲明上下文的方式。比較新的方式是在TOMCAT_HOME/conf/Localhost下創(chuàng)建上下文文件。在Preferences | Tomcat | Context declaration mode下選擇Context files,設(shè)置Context files為自動選擇(Tomcat 5.5.12)

5. 關(guān)閉Preferences。打開任意一個透視圖,將能看到工具欄上3個cat按鈕。啟動Tomcat,點擊第一個圖標(biāo)。這將創(chuàng)建一個新服務(wù)器進(jìn)程,Eclipse調(diào)試器將會自動附加上去。調(diào)試模式可以通過Preferences頁來修改。
6. 如果打算調(diào)試代碼,也可以增加項目到Tomcat源和classpath查找路徑。需要關(guān)注的一點,就是插件將會改變Tomcat輸出到Eclipse控制臺。另一個重要的事情就是附加或者預(yù)先將JAR文件放到classpath或者傳遞JVM參數(shù)到啟動器。這些可以在插件參數(shù)頁上設(shè)置。
配置可重新加載的Tomcat上下文
如果你無論如何也不想使用Sysdeo,那么也可以很容易的調(diào)試Tomcat:
- 首先為應(yīng)用創(chuàng)建一個新的Tomcat上下文,打開TOMCAT_HOME\conf\Catalina\localhost,創(chuàng)建一個新文件,例如myapp.xml。這將成為你url的一部分,因此如果你要訪問你的程序,你可以輸入http://localhost:8080/myapp
- 輸入下面的內(nèi)容在myapp.xml
- <Context docBase="c:/eclipse_workspace/myapp/WebRoot" path="/HelloWorld"/
假設(shè)你在c:/eclipse_workspace/myapp/WebRoot中有一個包含WEB-INF的web應(yīng)用
- 創(chuàng)建兩個環(huán)境變量:
- C:\>set JDPA_ADDRESS=1044
- C:\>set JDPA_TRANSPORT=dt_socket
- 現(xiàn)在可以用下面的調(diào)試參數(shù)來啟動Tomcat
- C:\Tomcat-5.5.12\bin\>catalina jdpa start
- 使用Eclipse通過1044來連接Tomcat
在Tomcat中熱交換代碼和自動上下文重載
在一些情況下,調(diào)試需要包含一些在變化的類,當(dāng)然希望調(diào)試器用的是最新的變動代碼而且準(zhǔn)確無誤的重新加載它們。這是最正常的情況了,但是不是總都這樣。為了重新加載上下文環(huán)境,你必須定義上下文環(huán)境為reloadable。
打開myapp.xml修改它:
<Context docBase="c:/eclipse_workspace/myapp/WebRoot" path="/HelloWorld" reloadable="true"/>
現(xiàn)在上下文將會在每次改變?nèi)魏?/span>Java文件的時候都會重載。注意加載時需要花費(fèi)一些時間的,尤其如果應(yīng)用程序比較大的話。類似的,如果你有比較復(fù)雜的啟動servlet,你可能希望讓自動重載無效,因為即使是最小的變動都會導(dǎo)致整個環(huán)境重新加載。
調(diào)試JSP頁面
在Eclipse中調(diào)試JSP,可以通過好幾種方式。最簡單的方法就是使用一些商業(yè)插件用于在建支持JSP調(diào)試。這樣的插件有MyEclipse和另外一種Nitrox。除了提供JSP調(diào)試外,這些商業(yè)插件還提供很多其他功能,例如數(shù)據(jù)庫資源管理器,XML編輯器,UML和ERD圖等等。這些插件的副作用是環(huán)境變得越來越大,反應(yīng)也會變慢。從我的經(jīng)歷來看,這些插件導(dǎo)致Eclipse相當(dāng)?shù)穆矣袝r環(huán)境變得很不穩(wěn)定。類似的,這些耗費(fèi)大內(nèi)存的插件是導(dǎo)致頻繁內(nèi)存溢出異常和隨后的環(huán)境崩潰的原因。長話短說,我最終決定還是使用最基本的。當(dāng)我意識到調(diào)試JSP可以不用任何插件時,建立這個過程稍微多會花些時間,但是回報的卻是快速和穩(wěn)定的環(huán)境。
在知道了JSP被轉(zhuǎn)化為Java文件后,調(diào)試JSP變得很容易。這個轉(zhuǎn)化發(fā)生在運(yùn)行時,JSP只存在在它們被javac編譯前。在這個例子中我將使用JBoss,然而可以使用類似的技術(shù)到其他服務(wù)器上。由于JBoss使用jasper和javac來生成和編譯Java,因此首先創(chuàng)建一個用于Java工程,其源代碼指向JBoss JSP輸出目錄。這個工程和普通的Java工程有一個顯著的區(qū)別:源目錄的大小將會不斷的變化,主要是因為JBosss要重新編譯JSP。
跟隨下面的步驟來建立Eclipse的JSP調(diào)試:
1. 啟動JBoss
2. 定位到JBoss編譯JSP的地方。這主要依賴于你發(fā)布是WAR包和你的真實的服務(wù)器配置,你可以找到類似于下面的位置:JBOSS_HOME\server\j2ee\work\jboss.web\localhost\myapp
3. 啟動Eclipse,打開File | New | Other....選擇Java Project點擊Next。
4. 在New Java Project頁,輸入項目名稱,例如my_jsp.其他想保持缺省狀態(tài),點擊Finish。

5. 創(chuàng)建一個新目錄鏈接到JBOSS_HOME\server\j2ee\work\jboss.web\localhost\myapp。這個目錄將會在以后成為項目源代碼目錄

6. 使src成為源代碼目錄。打開File | New | Source Folder
7. 點擊Browse而且選擇src,點擊Finish。保持和下面的對話框一致。

8. 在上面的對話框里,修改項目輸出目錄為src。
9. Eclipse將會試圖編譯my_jsp,但是將會看到許多問題。為了項目能夠正確編譯兩個主要問題必須解決。首先,jasper庫必須加入項目的classpath中,第二必須指出Java代碼工程my_java_code(假設(shè)分離Java項目主機(jī)域類和servlet)。
10. 打開Project properties,增加下面的庫到classpath:
11. JBOSS_HOME/server/j2ee/deploy/jbossweb-tomcat50.sar/jasper-runtime.jar
12. JBOSS_HOME/server/j2ee/lib/javax.servlet.jsp.jar
13. 而且,點擊Project頁增加my_java_code到classpath。現(xiàn)在my_jsp工程classpath如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry excluding="src/" kind="src" path=""/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="lib" path="C:/jboss-4.0.1sp1/server/j2ee/deploy/jbossweb-tomcat50.sar/jasper-runtime.jar"/>
<classpathentry kind="lib" path="C:/jboss-4.0.1sp1/server/j2ee/lib/javax.servlet.jsp.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/my_java_code"/>
<classpathentry kind="output" path="src"/>
</classpath>
14. 打開Project | Build Project。這次編譯應(yīng)該沒問題了。
15. 啟動JBoss。使用Eclipse調(diào)試器開始調(diào)試會話
16. 打開一個瀏覽器訪問幾個頁面。回到Eclipse,右鍵點擊my_jsp選擇Refresh。你將會看到多出Java的類文件。
17. 在任何類上雙擊,打開_jspService方法,設(shè)置一個斷點。返回到瀏覽器點擊Refresh
JSP頁面將會關(guān)聯(lián)上來,你就可以進(jìn)入代碼了。當(dāng)調(diào)試器靜進(jìn)入響應(yīng)JSP頁面的Java類,JSP編輯器將會自動鏈接起來,你將會自動進(jìn)入JSP代碼的感覺。所有變量將會被賦值,然后你真實的在調(diào)試任何Java類。現(xiàn)在大功告成了。
調(diào)試器驗證
現(xiàn)在可以在調(diào)試模式下啟動你的應(yīng)用程序。只需要確保服務(wù)器正在監(jiān)聽1044端口,你可以運(yùn)行netstat /a.你將會在打開的端口列表中看到1044端口。(參見圖: 打開端口列表: netstat -a)。

打開端口的列表: netstat -a
Eclipse連接
在保證weblogic正在端口1044上監(jiān)聽正在來到的連接后,剩下的事就是要告訴Eclipse連接這個端口,你可以準(zhǔn)備調(diào)試了。
1. 在Eclipse里,打開Run | Debug(參見圖: 在Eclipse中創(chuàng)建遠(yuǎn)程Java應(yīng)用配置)。
2. 在左邊列中選擇Remote Java Application,在列的底部點擊New
3. 在Create configuration界面上,將被提示輸入一些值。首先設(shè)置一個有意義的名詞。在我的例子中設(shè)置為WebLogic Instance。對于項目,選擇你想調(diào)試的包含源代碼的Java工程。保留Connection Type為缺省值,等等Standard (Socket Attach)。對于Host,輸入localhost。如果想調(diào)試遠(yuǎn)程服務(wù)器,輸入主機(jī)名或者IP地址。對于端口,輸入1044或者輸入你定義在Weblogic啟動腳本中的端口
4. 點擊Apply
5. 確保Weblogic實例運(yùn)行在調(diào)試模式。在界面上點擊Debug。Eclipse應(yīng)該自動進(jìn)入Debug透視圖,可以看到Debug試圖下的堆棧跟蹤。
6. 如果沒有自動進(jìn)入Debug透視圖,選擇Window | Open Perspective | Other然后點擊Debug。

在Eclipse中創(chuàng)建遠(yuǎn)程Java應(yīng)用配置

Eclipse調(diào)試器中的斷點
Eclipse調(diào)試窗口應(yīng)該自動在你第一個斷點處自動彈出棧(參見圖: Eclipse調(diào)試器中的斷點)。然后,你可以使用調(diào)試器提供的所有功能,即變量值、進(jìn)入代碼,drop to frame等等。
參考
Debugging J2EE Applications
Connecting to a Remote VM with the Java Remote Application Launcher
Debugging with the Eclipse Platform
系統(tǒng)信息
Windows XP Professional
JDK 1.4.2_07
Eclipse 3.2
BEA WebLogic 8.1
JBoss 4.0.2
Tomcat 5.5.12
posted on 2008-07-06 21:53
一葉笑天 閱讀(6004)
評論(0) 編輯 收藏 所屬分類:
Eclipse技術(shù)