一葉笑天
          雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
          posts - 73,comments - 7,trackbacks - 0
            翻譯文章網址:http://www.jacoozi.com/index.php?option=com_content&task=view&id=119&Itemid=134

          試圖修復服務器端的Java問題,花費大量時間獲取問題源的經歷不知道發生了多少次?調試器可以顯著地縮短錯誤發現時間而且使調試過程更加變得享受。這篇文章將探索如何在Eclipse中使用遠程調試器。

          文章內容:

          Java調試器

          調試Weblogic

          調試IBM WebSphere 5.x/6.x

          調試JBoss

          JBoss中熱交換代碼

          調試Tomcat

          調試JSP頁面

          調試器驗證

          參考

          系統信息

          Java調試器

          Java調試器(jdb)是一個動態的,可控的,基于任務的調試工具。它幫助找到并修復本地的和服務器端的Java語言的臭蟲。為了在J2EE應用服務器中使用jdb,首先必須讓eclipse中的調試成為可用,而且將通過JPDA端口(默認端口是1044)的調試和服務器關聯在一起。

          J2EE服務器缺省的JPDA選項如下:

          -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

          Jdb參數指定調試器操作方式。例如transport=dt_socket告訴JVM調試器將會通過socket連接,然而address=1044通知端口號是1044.類似地,如果你設置suspend=y,JVM將會以掛起模式(suspended mode)啟動,保持掛起狀態直到調試器關聯上它。如果想一啟動JVM就想啟動調試,那么這將是有幫助的。

          調試Weblogic

          調試Weblogic和調試其他Java遠程應用沒有什么區別。需要確保啟動Weblogic時設置了必須的調試參數,而且連接了調試器。就Weblogic8.1來說,需要增加下列參數在啟動腳本中。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"后和其他參數前。

          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

           

          調試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域中編輯參數。可以粘貼下面的的代碼,使用相同的1044端口從eclipse調試:

          -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

          調試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,應用程序的classpathC:\classes\myapp。通過設置這個目錄為項目輸出目錄來告訴Eclipse編譯應用程序到這個目錄下。這樣基本上可以工作了,但是有點隱患。

          如果每次都使用Ant腳本來build-clean,或許想確保輸出目錄的內容不要偶然地被Eclipse清除掉。由于Eclipse有項目的清除功能,這種功能能容易重擊整個目錄從而僅僅得到類文件。為此,為了保持Ant生成的文件和Eclipse將生成的*.class文件在一起,你必須告訴Eclipse你的輸出目錄。

          1.      首先設置Java項目輸出目錄。假設JBoss應用程序的classpathEclipse工作空間之外,這樣設置一個鏈接的目錄將是個不錯的選擇。

          2.      打開File | New | Folder

          3.      輸入classes作為目錄名字,點擊Advanced,指定新目錄為C:\classes\myapp

          4.      在項目屬性頁,修改輸出目錄為新創建的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。這就是說,現在每次你保存Java文件,Eclipse會重新編譯它而且JBoss也會重新加載它。

          調試Tomcat

          調試Tomcat非常類似于WeblogicJBoss,但是需要修改TOMCAT_HOME/bin下的catalina.bat/catalina.sh文件。

          Tomcat是一個特殊的情況,因為它能夠調試和發布置換熱代碼(hot code)

          Eclipse中使用Sysdeo Tomcat Plugin

          SysdeoEclipse下小而強大的Tomcat插件。和其他插件一起使用Sysdeo將會讓你調試Tomcat和重新加載上下文。

          1.      首先從Sysdeo網站下載插件

          2.      解壓文件到ECLIPSE_HOME/plugins目錄

          3.      啟動Eclipse,打開Window | Preferences... | Tomcat.

          4.      在插件參數頁,指定Tomcat版本和主目錄。在Tomcat中有兩種聲明上下文的方式。比較新的方式是在TOMCAT_HOME/conf/Localhost下創建上下文文件。在Preferences | Tomcat | Context declaration mode下選擇Context files,設置Context files為自動選擇(Tomcat 5.5.12)

          5.      關閉Preferences。打開任意一個透視圖,將能看到工具欄上3cat按鈕。啟動Tomcat,點擊第一個圖標。這將創建一個新服務器進程,Eclipse調試器將會自動附加上去。調試模式可以通過Preferences頁來修改。

          6.      如果打算調試代碼,也可以增加項目到Tomcat源和classpath查找路徑。需要關注的一點,就是插件將會改變Tomcat輸出到Eclipse控制臺。另一個重要的事情就是附加或者預先將JAR文件放到classpath或者傳遞JVM參數到啟動器。這些可以在插件參數頁上設置。

          配置可重新加載的Tomcat上下文

          如果你無論如何也不想使用Sysdeo,那么也可以很容易的調試Tomcat

          1. 首先為應用創建一個新的Tomcat上下文,打開TOMCAT_HOME\conf\Catalina\localhost,創建一個新文件,例如myapp.xml。這將成為你url的一部分,因此如果你要訪問你的程序,你可以輸入http://localhost:8080/myapp
          2. 輸入下面的內容在myapp.xml
          3. <Context docBase="c:/eclipse_workspace/myapp/WebRoot" path="/HelloWorld"/

          假設你在c:/eclipse_workspace/myapp/WebRoot中有一個包含WEB-INFweb應用

          1. 創建兩個環境變量:
          2. C:\>set JDPA_ADDRESS=1044
          3. C:\>set JDPA_TRANSPORT=dt_socket
          4. 現在可以用下面的調試參數來啟動Tomcat
          5. C:\Tomcat-5.5.12\bin\>catalina jdpa start
          6. 使用Eclipse通過1044來連接Tomcat

          Tomcat中熱交換代碼和自動上下文重載

          在一些情況下,調試需要包含一些在變化的類,當然希望調試器用的是最新的變動代碼而且準確無誤的重新加載它們。這是最正常的情況了,但是不是總都這樣。為了重新加載上下文環境,你必須定義上下文環境為reloadable

          打開myapp.xml修改它:

          <Context docBase="c:/eclipse_workspace/myapp/WebRoot" path="/HelloWorld" reloadable="true"/>

          現在上下文將會在每次改變任何Java文件的時候都會重載。注意加載時需要花費一些時間的,尤其如果應用程序比較大的話。類似的,如果你有比較復雜的啟動servlet,你可能希望讓自動重載無效,因為即使是最小的變動都會導致整個環境重新加載。

          調試JSP頁面

          Eclipse中調試JSP,可以通過好幾種方式。最簡單的方法就是使用一些商業插件用于在建支持JSP調試。這樣的插件有MyEclipse和另外一種Nitrox。除了提供JSP調試外,這些商業插件還提供很多其他功能,例如數據庫資源管理器,XML編輯器,UMLERD圖等等。這些插件的副作用是環境變得越來越大,反應也會變慢。從我的經歷來看,這些插件導致Eclipse相當的慢,而且有時環境變得很不穩定。類似的,這些耗費大內存的插件是導致頻繁內存溢出異常和隨后的環境崩潰的原因。長話短說,我最終決定還是使用最基本的。當我意識到調試JSP可以不用任何插件時,建立這個過程稍微多會花些時間,但是回報的卻是快速和穩定的環境。

          在知道了JSP被轉化為Java文件后,調試JSP變得很容易。這個轉化發生在運行時,JSP只存在在它們被javac編譯前。在這個例子中我將使用JBoss,然而可以使用類似的技術到其他服務器上。由于JBoss使用jasperjavac來生成和編譯Java,因此首先創建一個用于Java工程,其源代碼指向JBoss JSP輸出目錄。這個工程和普通的Java工程有一個顯著的區別:源目錄的大小將會不斷的變化,主要是因為JBosss要重新編譯JSP

          跟隨下面的步驟來建立EclipseJSP調試:

          1.      啟動JBoss

          2.      定位到JBoss編譯JSP的地方。這主要依賴于你發布是WAR包和你的真實的服務器配置,你可以找到類似于下面的位置:JBOSS_HOME\server\j2ee\work\jboss.web\localhost\myapp

          3.      啟動Eclipse,打開File | New | Other....選擇Java Project點擊Next

          4.      New Java Project頁,輸入項目名稱,例如my_jsp.其他想保持缺省狀態,點擊Finish

          5.      創建一個新目錄鏈接到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(假設分離Java項目主機域類和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_codeclasspath。現在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。這次編譯應該沒問題了。

          15.  啟動JBoss。使用Eclipse調試器開始調試會話

          16.  打開一個瀏覽器訪問幾個頁面。回到Eclipse,右鍵點擊my_jsp選擇Refresh。你將會看到多出Java的類文件。

          17.  在任何類上雙擊,打開_jspService方法,設置一個斷點。返回到瀏覽器點擊Refresh

          JSP頁面將會關聯上來,你就可以進入代碼了。當調試器靜進入響應JSP頁面的Java類,JSP編輯器將會自動鏈接起來,你將會自動進入JSP代碼的感覺。所有變量將會被賦值,然后你真實的在調試任何Java類。現在大功告成了。

          調試器驗證

          現在可以在調試模式下啟動你的應用程序。只需要確保服務器正在監聽1044端口,你可以運行netstat /a.你將會在打開的端口列表中看到1044端口。(參見圖: 打開端口列表: netstat -a)


               打開端口的列表
          : netstat -a

          Eclipse連接

          在保證weblogic正在端口1044上監聽正在來到的連接后,剩下的事就是要告訴Eclipse連接這個端口,你可以準備調試了。

          1.      Eclipse里,打開Run | Debug(參見圖: Eclipse中創建遠程Java應用配置)

          2.      在左邊列中選擇Remote Java Application,在列的底部點擊New

          3.      Create configuration界面上,將被提示輸入一些值。首先設置一個有意義的名詞。在我的例子中設置為WebLogic Instance。對于項目,選擇你想調試的包含源代碼的Java工程。保留Connection Type為缺省值,等等Standard (Socket Attach)。對于Host,輸入localhost。如果想調試遠程服務器,輸入主機名或者IP地址。對于端口,輸入1044或者輸入你定義在Weblogic啟動腳本中的端口

          4.      點擊Apply

          5.      確保Weblogic實例運行在調試模式。在界面上點擊DebugEclipse應該自動進入Debug透視圖,可以看到Debug試圖下的堆棧跟蹤。

          6.      如果沒有自動進入Debug透視圖,選擇Window | Open Perspective | Other然后點擊Debug

          Eclipse中創建遠程Java應用配置

          Eclipse調試器中的斷點

          Eclipse調試窗口應該自動在你第一個斷點處自動彈出棧(參見圖: Eclipse調試器中的斷點)。然后,你可以使用調試器提供的所有功能,即變量值、進入代碼,drop to frame等等。

          參考

          *       Debugging J2EE Applications

          *       Connecting to a Remote VM with the Java Remote Application Launcher

          *       Debugging with the Eclipse Platform

          系統信息

          *       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 一葉笑天 閱讀(6006) 評論(0)  編輯  收藏 所屬分類: Eclipse技術
          主站蜘蛛池模板: 九龙坡区| 吉安县| 清水河县| 珠海市| 米林县| 顺昌县| 图木舒克市| 贵州省| 鄂温| 沂水县| 正宁县| 苗栗县| 仙游县| 临邑县| 五指山市| 阳西县| 邵东县| 黄冈市| 三门县| 怀宁县| 北京市| 东乡族自治县| 法库县| 华亭县| 廉江市| 伊金霍洛旗| 开鲁县| 仁怀市| 南陵县| 班玛县| 诏安县| 万州区| 新和县| 阿坝县| 无锡市| 枝江市| 富民县| 周至县| 贵德县| 佛教| 娱乐|