試圖修復(fù)服務(wù)器端的Java問題,花費(fèi)大量時(shí)間獲取問題源的經(jīng)歷不知道發(fā)生了多少次?調(diào)試器可以顯著地縮短錯(cuò)誤發(fā)現(xiàn)時(shí)間而且使調(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)試器驗(yàn)證
參考
系統(tǒng)信息
Java調(diào)試器(jdb)是一個(gè)動(dòng)態(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選項(xiàng)如下:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
Jdb參數(shù)指定調(diào)試器操作方式。例如transport=dt_socket告訴JVM調(diào)試器將會(huì)通過socket連接,然而address=1044通知端口號(hào)是1044.類似地,如果你設(shè)置suspend=y,JVM將會(huì)以掛起模式(suspended mode)啟動(dòng),保持掛起狀態(tài)直到調(diào)試器關(guān)聯(lián)上它。如果想一啟動(dòng)JVM就想啟動(dòng)調(diào)試,那么這將是有幫助的。
調(diào)試Weblogic
調(diào)試Weblogic和調(diào)試其他Java遠(yuǎn)程應(yīng)用沒有什么區(qū)別。需要確保啟動(dòng)Weblogic時(shí)設(shè)置了必須的調(diào)試參數(shù),而且連接了調(diào)試器。就Weblogic8.1來說,需要增加下列參數(shù)在啟動(dòng)腳本中。Weblogic提供多個(gè)啟動(dòng)腳本(*.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啟動(dòng)命令中,放在"%JAVA_HOME%\bin\java"后和其他參數(shù)前。
3. 啟動(dòng)腳本類似于下面的腳本:
"%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控制臺(tái)
2. 打開Servers | Application Servers | [SERVERNAME] | Process Definition | Java Virtual Machine
3. 注冊(cè)Debug Mode
4. 在Debug arguments域中編輯參數(shù)。可以粘貼下面的的代碼,使用相同的1044端口從eclipse調(diào)試:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
除了需要修改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è)置這個(gè)目錄為項(xiàng)目輸出目錄來告訴Eclipse編譯應(yīng)用程序到這個(gè)目錄下。這樣基本上可以工作了,但是有點(diǎn)隱患。
如果每次都使用Ant腳本來build-clean,或許想確保輸出目錄的內(nèi)容不要偶然地被Eclipse清除掉。由于Eclipse有項(xiàng)目的清除功能,這種功能能容易重?fù)粽麄€(gè)目錄從而僅僅得到類文件。為此,為了保持Ant生成的文件和Eclipse將生成的*.class文件在一起,你必須告訴Eclipse你的輸出目錄。
1. 首先設(shè)置Java項(xiàng)目輸出目錄。假設(shè)JBoss應(yīng)用程序的classpath在Eclipse工作空間之外,這樣設(shè)置一個(gè)鏈接的目錄將是個(gè)不錯(cuò)的選擇。
2. 打開File | New | Folder。
3. 輸入classes作為目錄名字,點(diǎn)擊Advanced,指定新目錄為C:\classes\myapp。
4. 在項(xiàng)目屬性頁,修改輸出目錄為新創(chuàng)建的classes目錄。點(diǎn)擊Project | Properties | Java Build Path,在Default output foder中寫入如下值。
5. 打開Window | Preferences... | General | Workspace,選中Build automatically。
6. 最后,告訴Eclipse不要每次編譯項(xiàng)目的時(shí)候刪除輸出目錄的其他文件。依然在Preferences中打開Java | Compiler | Building,不要選中Scrub output folders when cleaning projects。這就是說,現(xiàn)在每次你保存Java文件,Eclipse會(huì)重新編譯它而且JBoss也會(huì)重新加載它。
調(diào)試Tomcat
調(diào)試Tomcat非常類似于Weblogic和JBoss,但是需要修改TOMCAT_HOME/bin下的catalina.bat/catalina.sh文件。
Tomcat是一個(gè)特殊的情況,因?yàn)樗軌蛘{(diào)試和發(fā)布置換熱代碼(hot code)。
在Eclipse中使用Sysdeo Tomcat Plugin
Sysdeo是Eclipse下小而強(qiáng)大的Tomcat插件。和其他插件一起使用Sysdeo將會(huì)讓你調(diào)試Tomcat和重新加載上下文。
1. 首先從Sysdeo網(wǎng)站下載插件
2. 解壓文件到ECLIPSE_HOME/plugins目錄
3. 啟動(dòng)Eclipse,打開Window | Preferences... | Tomcat.
4. 在插件參數(shù)頁,指定Tomcat版本和主目錄。在Tomcat中有兩種聲明上下文的方式。比較新的方式是在TOMCAT_HOME/conf/Localhost下創(chuàng)建上下文文件。在Preferences | Tomcat | Context declaration mode下選擇Context files,設(shè)置Context files為自動(dòng)選擇(Tomcat 5.5.12)
5. 關(guān)閉Preferences。打開任意一個(gè)透視圖,將能看到工具欄上3個(gè)cat按鈕。啟動(dòng)Tomcat,點(diǎn)擊第一個(gè)圖標(biāo)。這將創(chuàng)建一個(gè)新服務(wù)器進(jìn)程,Eclipse調(diào)試器將會(huì)自動(dòng)附加上去。調(diào)試模式可以通過Preferences頁來修改。
6. 如果打算調(diào)試代碼,也可以增加項(xiàng)目到Tomcat源和classpath查找路徑。需要關(guān)注的一點(diǎn),就是插件將會(huì)改變Tomcat輸出到Eclipse控制臺(tái)。另一個(gè)重要的事情就是附加或者預(yù)先將JAR文件放到classpath或者傳遞JVM參數(shù)到啟動(dòng)器。這些可以在插件參數(shù)頁上設(shè)置。
配置可重新加載的Tomcat上下文
如果你無論如何也不想使用Sysdeo,那么也可以很容易的調(diào)試Tomcat:
首先為應(yīng)用創(chuàng)建一個(gè)新的Tomcat上下文,打開TOMCAT_HOME\conf\Catalina\localhost,創(chuàng)建一個(gè)新文件,例如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中有一個(gè)包含WEB-INF的web應(yīng)用
創(chuàng)建兩個(gè)環(huán)境變量:
C:\>set JDPA_ADDRESS=1044
C:\>set JDPA_TRANSPORT=dt_socket
現(xiàn)在可以用下面的調(diào)試參數(shù)來啟動(dòng)Tomcat
C:\Tomcat-5.5.12\bin\>catalina jdpa start
使用Eclipse通過1044來連接Tomcat
在Tomcat中熱交換代碼和自動(dòng)上下文重載
在一些情況下,調(diào)試需要包含一些在變化的類,當(dāng)然希望調(diào)試器用的是最新的變動(dòng)代碼而且準(zhǔn)確無誤的重新加載它們。這是最正常的情況了,但是不是總都這樣。為了重新加載上下文環(huán)境,你必須定義上下文環(huán)境為reloadable。
打開myapp.xml修改它:
<Context docBase="c:/eclipse_workspace/myapp/WebRoot" path="/HelloWorld" reloadable="true"/>
現(xiàn)在上下文將會(huì)在每次改變?nèi)魏?/span>Java文件的時(shí)候都會(huì)重載。注意加載時(shí)需要花費(fèi)一些時(shí)間的,尤其如果應(yīng)用程序比較大的話。類似的,如果你有比較復(fù)雜的啟動(dòng)servlet,你可能希望讓自動(dòng)重載無效,因?yàn)榧词故亲钚〉淖儎?dòng)都會(huì)導(dǎo)致整個(gè)環(huán)境重新加載。
調(diào)試JSP頁面
在Eclipse中調(diào)試JSP,可以通過好幾種方式。最簡(jiǎn)單的方法就是使用一些商業(yè)插件用于在建支持JSP調(diào)試。這樣的插件有MyEclipse和另外一種Nitrox。除了提供JSP調(diào)試外,這些商業(yè)插件還提供很多其他功能,例如數(shù)據(jù)庫資源管理器,XML編輯器,UML和ERD圖等等。這些插件的副作用是環(huán)境變得越來越大,反應(yīng)也會(huì)變慢。從我的經(jīng)歷來看,這些插件導(dǎo)致Eclipse相當(dāng)?shù)穆?,而且有時(shí)環(huán)境變得很不穩(wěn)定。類似的,這些耗費(fèi)大內(nèi)存的插件是導(dǎo)致頻繁內(nèi)存溢出異常和隨后的環(huán)境崩潰的原因。長(zhǎng)話短說,我最終決定還是使用最基本的。當(dāng)我意識(shí)到調(diào)試JSP可以不用任何插件時(shí),建立這個(gè)過程稍微多會(huì)花些時(shí)間,但是回報(bào)的卻是快速和穩(wěn)定的環(huán)境。
在知道了JSP被轉(zhuǎn)化為Java文件后,調(diào)試JSP變得很容易。這個(gè)轉(zhuǎn)化發(fā)生在運(yùn)行時(shí),JSP只存在在它們被javac編譯前。在這個(gè)例子中我將使用JBoss,然而可以使用類似的技術(shù)到其他服務(wù)器上。由于JBoss使用jasper和javac來生成和編譯Java,因此首先創(chuàng)建一個(gè)用于Java工程,其源代碼指向JBoss JSP輸出目錄。這個(gè)工程和普通的Java工程有一個(gè)顯著的區(qū)別:源目錄的大小將會(huì)不斷的變化,主要是因?yàn)?/span>JBosss要重新編譯JSP。
跟隨下面的步驟來建立Eclipse的JSP調(diào)試:
1. 啟動(dòng)JBoss
2. 定位到JBoss編譯JSP的地方。這主要依賴于你發(fā)布是WAR包和你的真實(shí)的服務(wù)器配置,你可以找到類似于下面的位置:JBOSS_HOME\server\j2ee\work\jboss.web\localhost\myapp
3. 啟動(dòng)Eclipse,打開File | New | Other....選擇Java Project點(diǎn)擊Next。
4. 在New Java Project頁,輸入項(xiàng)目名稱,例如my_jsp.其他想保持缺省狀態(tài),點(diǎn)擊Finish。
5. 創(chuàng)建一個(gè)新目錄鏈接到JBOSS_HOME\server\j2ee\work\jboss.web\localhost\myapp。這個(gè)目錄將會(huì)在以后成為項(xiàng)目源代碼目錄
6. 使src成為源代碼目錄。打開File | New | Source Folder
7. 點(diǎn)擊Browse而且選擇src,點(diǎn)擊Finish。保持和下面的對(duì)話框一致。
8. 在上面的對(duì)話框里,修改項(xiàng)目輸出目錄為src。
9. Eclipse將會(huì)試圖編譯my_jsp,但是將會(huì)看到許多問題。為了項(xiàng)目能夠正確編譯兩個(gè)主要問題必須解決。首先,jasper庫必須加入項(xiàng)目的classpath中,第二必須指出Java代碼工程my_java_code(假設(shè)分離Java項(xiàng)目主機(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. 而且,點(diǎn)擊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. 啟動(dòng)JBoss。使用Eclipse調(diào)試器開始調(diào)試會(huì)話
16. 打開一個(gè)瀏覽器訪問幾個(gè)頁面?;氐?/span>Eclipse,右鍵點(diǎn)擊my_jsp選擇Refresh。你將會(huì)看到多出Java的類文件。
17. 在任何類上雙擊,打開_jspService方法,設(shè)置一個(gè)斷點(diǎn)。返回到瀏覽器點(diǎn)擊Refresh
JSP頁面將會(huì)關(guān)聯(lián)上來,你就可以進(jìn)入代碼了。當(dāng)調(diào)試器靜進(jìn)入響應(yīng)JSP頁面的Java類,JSP編輯器將會(huì)自動(dòng)鏈接起來,你將會(huì)自動(dòng)進(jìn)入JSP代碼的感覺。所有變量將會(huì)被賦值,然后你真實(shí)的在調(diào)試任何Java類?,F(xiàn)在大功告成了。
現(xiàn)在可以在調(diào)試模式下啟動(dòng)你的應(yīng)用程序。只需要確保服務(wù)器正在監(jiān)聽1044端口,你可以運(yùn)行netstat /a.你將會(huì)在打開的端口列表中看到1044端口。(參見圖: 打開端口列表: netstat -a)。
打開端口的列表: netstat -a
Eclipse連接
在保證weblogic正在端口1044上監(jiān)聽正在來到的連接后,剩下的事就是要告訴Eclipse連接這個(gè)端口,你可以準(zhǔn)備調(diào)試了。
1. 在Eclipse里,打開Run | Debug(參見圖: 在Eclipse中創(chuàng)建遠(yuǎn)程Java應(yīng)用配置)。
2. 在左邊列中選擇Remote Java Application,在列的底部點(diǎn)擊New
3. 在Create configuration界面上,將被提示輸入一些值。首先設(shè)置一個(gè)有意義的名詞。在我的例子中設(shè)置為WebLogic Instance。對(duì)于項(xiàng)目,選擇你想調(diào)試的包含源代碼的Java工程。保留Connection Type為缺省值,等等Standard (Socket Attach)。對(duì)于Host,輸入localhost。如果想調(diào)試遠(yuǎn)程服務(wù)器,輸入主機(jī)名或者IP地址。對(duì)于端口,輸入1044或者輸入你定義在Weblogic啟動(dòng)腳本中的端口
4. 點(diǎn)擊Apply
5. 確保Weblogic實(shí)例運(yùn)行在調(diào)試模式。在界面上點(diǎn)擊Debug。Eclipse應(yīng)該自動(dòng)進(jìn)入Debug透視圖,可以看到Debug試圖下的堆棧跟蹤。
6. 如果沒有自動(dòng)進(jìn)入Debug透視圖,選擇Window | Open Perspective | Other然后點(diǎn)擊Debug。
在Eclipse中創(chuàng)建遠(yuǎn)程Java應(yīng)用配置
Eclipse調(diào)試器中的斷點(diǎn)
Eclipse調(diào)試窗口應(yīng)該自動(dòng)在你第一個(gè)斷點(diǎn)處自動(dòng)彈出棧(參見圖: Eclipse調(diào)試器中的斷點(diǎn))。然后,你可以使用調(diào)試器提供的所有功能,即變量值、進(jìn)入代碼,drop to frame等等。
聯(lián)系客服