<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Java Web Application 遠程調試

    最近在開發java web application的時候,因為很多原因,無法對自己開發的項目在本地進行調試,常常需要進行遠程調試,之前一直通過打logger的方式進行,每次都要重新部署,相當的痛苦,今天下午研究了以下,如果進行遠程調試。

    開發的web application是部署在tomcat上面的,那么問題就轉化為如何調試tomcat。其實調試tomcat,本質上就是調試JVM。JVM的強大,從J2SE1.4.2開始,就實現了JPDA (Java Platform Debug Architecture)。

    tomcat默認情況下,是沒有啟用jpda的,如果要啟用,需要傳入參數
    -Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y

    那么問題是這些參數如何在tomcat啟動的使用傳入呢?這是時候,需要了解tomcat的啟動腳本,在TOMCAT_HOME/bin

    目錄下,有三個腳本catalina.sh, startup.sh, 和 shutdown.sh。如果查看startup.sh和shutdown.sh,都是通過catalina.sh來啟動的。腳本如下:

    EXECUTABLE=catalina.sh

    exec "$PRGDIR"/"$EXECUTABLE" start "$@"
    于是,我們可以查看下catalina.sh的腳本是如何實現的。

    #   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
    #                   command is executed. The default is "dt_socket".
    #
    #   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
    #                   command is executed. The default is 8000.
    #
    #   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"
    #                   command is executed. Specifies whether JVM should suspend
    #                   execution immediately after startup. Default is "n".
    #
    #   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"
    #                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
    #                   and JPDA_SUSPEND are ignored. Thus, all required jpda
    #                   options MUST be specified. The default is:
    #
    #                   -agentlib:jdwp=transport=$JPDA_TRANSPORT,
    #                       address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND

    if [ "$1" = "jpda" ] ; then
      if [ -z "$JPDA_TRANSPORT" ]; then
        JPDA_TRANSPORT="dt_socket"
      fi  
      if [ -z "$JPDA_ADDRESS" ]; then
        JPDA_ADDRESS="8000"
      fi  
      if [ -z "$JPDA_SUSPEND" ]; then
        JPDA_SUSPEND="n"
      fi  
      if [ -z "$JPDA_OPTS" ]; then
        JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
      fi  
      CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
      shift
    fi

    通過這個代碼,我們可以看出,其實要啟動jpda, 最主要的是要對JPDA_SUSPEND的值進行設置,由N改為Y。

    借鑒start.sh的啟動,在linux下,我們可以自己創建一個jpda.sh的腳本,用來啟動開啟debug模式的tomcat,具體腳本如下,黑體為修改部分。

    os400=false
    darwin=false
    case "`uname`" in
    CYGWIN*) cygwin=true;;
    OS400*) os400=true;;
    Darwin*) darwin=true;;
    esac

    # resolve links - $0 may be a softlink
    PRG="$0"

    while [ -h "$PRG" ] ; do
      ls=`ls -ld "$PRG"`
      link=`expr "$ls" : '.*-> \(.*\)$'`
      if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
      else
        PRG=`dirname "$PRG"`/"$link"
      fi
    done
     
    PRGDIR=`dirname "$PRG"`
    EXECUTABLE=catalina.sh

    # Check that target executable exists
    if $os400; then
      # -x will Only work on the os400 if the files are: 
      # 1. owned by the user
      # 2. owned by the PRIMARY group of the user
      # this will not work if the user belongs in secondary groups
      eval
    else
      if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
        echo "Cannot find $PRGDIR/$EXECUTABLE"
        echo "The file is absent or does not have execute permission"
        echo "This file is needed to run this program"
        exit 1
      fi
    fi 

    export JPDA_SUSPEND=y

    exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

     

    在Eclipse中遠程調試Tomcat

    首先將Tomcat 5.5.26的源代碼分為container connectors jasper servletapi build五個項目,導入到Eclipse中。啟動相關的代碼主要在container中,就以它為當前項目,打開”Debug Configurations“對話框。

    然后創建一個”Remote Java Application“,Connection Type選擇”Standard (Socket Attach)“,Host填寫localhost(Tomcat所在的主機地址),Port填寫8000。最后點擊”Apply“保存。

    Eclipse的Debug Configurations對話框中配置遠程調試

     

    首先確保已經執行了jpda.bat,Tomcat正在等待調試器連接;然后執行上述的Debug Configuration,Eclipse就可以連上Tomcat。

     

    Tomcat的啟動是從Bootstrap的main方法開始,我在第一行代碼處設置了斷點,Tomcat的啟動就停在了這一行:

     

    斷點調試Tomcat的啟動過程

     

    接著,讓Tomcat繼續執行,我們可以看到,控制臺輸出了啟動信息。

    Tomcat在JPDA模式下繼續啟動



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2013-05-05 16:49 Chan Chen 閱讀(1635) 評論(0)  編輯  收藏 所屬分類: Linux

    主站蜘蛛池模板: 成人片黄网站色大片免费| 99久久精品免费视频| 免费毛片在线播放| 99久久婷婷国产综合亚洲| 国产免费的野战视频| 亚洲欧洲日产v特级毛片| 亚洲成人免费网址| 亚洲午夜在线播放| 女人18毛片特级一级免费视频| 中文字幕在线日亚洲9| 在线视频免费观看www动漫| 国产午夜亚洲精品不卡电影| 亚洲AV之男人的天堂| 一级毛片免费视频网站| 夜夜春亚洲嫩草影院| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 亚洲av日韩aⅴ无码色老头| 国内大片在线免费看| 偷自拍亚洲视频在线观看| 久久99亚洲综合精品首页| 91成人免费福利网站在线| 亚洲国语精品自产拍在线观看| 亚洲人成免费网站| 亚洲乱人伦中文字幕无码| 亚洲精品无码专区2| 美女视频黄a视频全免费网站色窝| 亚洲今日精彩视频| 成人黄页网站免费观看大全| 无码免费又爽又高潮喷水的视频 | 日本人成在线视频免费播放| 亚洲美女视频一区二区三区| 成年性生交大片免费看| 高清免费久久午夜精品| 久久久久久亚洲av成人无码国产| 国产片AV片永久免费观看| 野花视频在线官网免费1| 久久亚洲国产午夜精品理论片| 成人免费黄色网址| 一级毛片免费在线| 亚洲人成网站18禁止久久影院 | 免费人成在线观看69式小视频|