<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

    主站蜘蛛池模板: 亚洲a级在线观看| 亚洲av无码一区二区三区在线播放| 亚洲伊人久久大香线蕉综合图片| 亚洲区小说区图片区| 亚洲成色999久久网站| 亚洲春黄在线观看| 菠萝菠萝蜜在线免费视频| 欧洲人免费视频网站在线| 精品久久久久久久免费加勒比| 国产精品亚洲产品一区二区三区| 亚洲伦另类中文字幕| 国产亚洲漂亮白嫩美女在线 | 免费可以在线看A∨网站| 亚洲国产精品视频| 亚洲AV一二三区成人影片| 好男人www免费高清视频在线| 亚洲色偷精品一区二区三区 | 7x7x7x免费在线观看| 亚洲欧洲国产成人综合在线观看| 日韩少妇内射免费播放| 四虎1515hh永久久免费| 亚洲精品少妇30p| 日韩毛片一区视频免费| 日韩精品成人无码专区免费| 亚洲欧美日韩一区二区三区| 国产h肉在线视频免费观看| 亚洲精品亚洲人成在线| 亚洲高清免费视频| 毛片在线播放免费观看| 四虎精品亚洲一区二区三区| 亚洲一区二区三区无码国产 | 成年性午夜免费视频网站不卡| 亚洲gv猛男gv无码男同短文| 特级av毛片免费观看| 亚洲精品成人片在线观看精品字幕 | 日韩电影免费在线观看视频 | 羞羞漫画小舞被黄漫免费| 亚洲韩国精品无码一区二区三区| 18禁无遮挡无码国产免费网站| 亚洲综合视频在线| 亚洲免费人成在线视频观看|