九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Eclipse遠程調(diào)試Tomcat

最近,一直在研究Tomcat的工作內(nèi)幕,主要的方法就是參考《How Tomcat Works》這本書和Tomcat 5.5.26的源代碼。

 

Tomcat的代碼結(jié)構(gòu)還是比較清晰的,注釋也比較全。但是代碼畢竟是靜態(tài)的,難以徹底弄清類與類之間的協(xié)作關(guān)系,以及運行時對象的交互關(guān)系。

 

如果能對Tomcat的啟動、處理請求和停止的過程進行斷點調(diào)試,看清Tomcat的每一步行蹤,那么就能解決上面的問題了。

 

于是,又一個問題出來了:如何使用Eclipse遠程調(diào)試Tomcat?

 

上網(wǎng)查了一些資料,相關(guān)的文章還是很多的。我簡單梳理了一下解決方案及原理,順便熟悉了Tomcat的啟動腳本。

 

如何遠程調(diào)試JVM?

遠程調(diào)試Tomcat,本質(zhì)上就是遠程調(diào)試JVM。倒不是需要了解JVM自身的運行細節(jié),而是要了解JVM上應(yīng)用程序的運行細節(jié)。

無論如何,我們都要獲取JVM運行時的內(nèi)部信息(比如查看調(diào)試信息),并對JVM的運行流程進行控制(比如單步執(zhí)行),才能達到調(diào)試的目的。

 

這個事情光靠調(diào)試器本身,肯定是做不到的。不然,JVM的安全性就大打折扣了。除非JVM提供某種“后門”,供調(diào)試器查詢一些運行時信息,并允許調(diào)試器發(fā)送一些控制命令。

 

不得不感慨,JVM的強大。從J2SE 1.4.2開始,就已經(jīng)提出并實現(xiàn)了JavaTM Platform Debugger Architecture,簡稱JPDA。

 

JPDA簡介

顧名思義,JPDA為Java平臺上的調(diào)試器定義了一個標(biāo)準(zhǔn)的體系結(jié)構(gòu)。該體系結(jié)構(gòu)包括3個主要組成部分:JVM TI、JDI和JDWP。

 

JVM TI的全稱是Java Virtual Machine Tool Interface,它定義了JVM為了支持調(diào)試而必須提供的功能及相應(yīng)的訪問接口。這些訪問接口是以本地語言的形式提供的,由JVM(比如Sun公司的HotSpot VM)負責(zé)實現(xiàn)。

不過,JVM TI只是JVM提供的一系列函數(shù),調(diào)試器(特別是遠程的調(diào)試器)如何調(diào)用呢?其實啊,JVM TI的直接客戶端并不是調(diào)試器,而是一個稱為“JPDA back-end”的東東。這個東東應(yīng)該是屬于JVM的一部分,在SUN JRE的bin目錄下可以找到j(luò)dwp.dll(jdwp.so)的庫文件,這就是JPDA back-end的實現(xiàn)。按我理解,JPDA back-end提供了各種訪問方式(共享內(nèi)存,Socket),通過這些方式接收調(diào)試器的請求,然后調(diào)用JVM TI接口。

 

JDI的全稱是Java Debug Interface,它定義了訪問JVM TI接口的高層API,以純Java語言提供,由JDK實現(xiàn)(在Sun JDK的tools.jar可以找到)。調(diào)試器直接使用JDI來實現(xiàn)調(diào)試的功能。與JPDA back-end相對應(yīng),JDI實現(xiàn)的角色就是JPDA front-end。

 

JDWP的全稱是Java Debug Wire Protocol,它定義了JPDA front-end和JPDA back-end之間通訊信息的二進制格式。這里的通訊信息主要包括兩種:調(diào)試器發(fā)送給JVM的請求信息和JVM發(fā)送給調(diào)試器的調(diào)試信息。

 

總結(jié)一下,調(diào)試器調(diào)用JDK提供的JDI實現(xiàn)(JPDA front-end),經(jīng)由JDWP協(xié)議,和JVM自帶的JPDA back-end(jdwp.dll, jdwp.so, ...)進行通訊。JPDA back-end通過調(diào)用JVM TI接口,從而獲知調(diào)試信息,或發(fā)送控制命令。然后,JPDA back-end將調(diào)試信息或命令執(zhí)行結(jié)果,通過JDWP協(xié)議,返回給調(diào)試器。

 

如何啟用JPDA

默認情況下,JVM并沒有啟用JPDA back-end。需要在啟動JVM的命令行加載以下參數(shù):

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

 

-Xdebug

啟用調(diào)試特性

-Xrunjdwp

啟用JDWP實現(xiàn),它包含若干子選項:

transport=dt_socket

JPDA front-end和back-end之間的傳輸方法。dt_socket表示使用套接字傳輸。

address=8000

JVM在8000端口上監(jiān)聽請求。

server=y

y表示啟動的JVM是被調(diào)試者。如果為n,則表示啟動的JVM是調(diào)試器。

suspend=y

y表示啟動的JVM會暫停等待,直到調(diào)試器連接上。

 

suspend=y這個選項很重要。如果你想從Tomcat啟動的一開始就進行調(diào)試,那么就必須設(shè)置suspend=y。

 

Tomcat的啟動腳本

只要Tomcat啟動時,啟用了JPDA,那么就可以被調(diào)試。而Tomcat默認是不啟用JPDA的,需要我們手動開啟。

 

開啟JPDA的方法也很簡單,對Tomcat的啟動腳本做點修改,把啟動JPDA的命令行參數(shù)添加進去,就可以了。

 

不過Tomcat啟動腳本還是有點復(fù)雜的,并不是簡單的”java ...“。我們先簡單的梳理一下。

 

在Tomcat 5.5.26發(fā)行版的bin目錄下,有N多腳本,其中與Tomcat啟停有關(guān)的腳本是(以Windows為例):

startup.bat        //啟動Tomcat

shutdown.bat   //停止Tomcat

catalina.bat       //包含啟動/停止Tomcat的核心邏輯

 

startup.bat和shutdown.bat都是通過調(diào)用catalina.bat來實現(xiàn)啟動和停止的功能,因此他倆的代碼都很少。主要的邏輯都在catalina.bat中。

 

catalina.bat是個強大的腳本,通過參數(shù),可以執(zhí)行各種動作,包括debug run start stop version等。

如果我們直接執(zhí)行catalina.bat,就可以看到它的用法說明:

 

 

startup.bat,其實就是執(zhí)行catalina.bat start;shutdown.bat,其實就是執(zhí)行catalina.bat stop。

不難猜到,我們可以寫一個jdpa.bat,直接調(diào)用catalina.bat jpda start,應(yīng)該就可以啟用JPDA。我們拷貝一份startup.bat,把下面這行

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

修改成

call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

 

不過,-Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y,這些選項參數(shù)怎么傳遞給catalina.bat呢?

看看catalina.bat前面的注釋,server的值默認就是y,transport的值是變量JPDA_TRANSPORT,address的值是變量JPDA_ADDRESS,suspend的值是變量JPDA_SUSPEND 。如果沒有顯式地復(fù)制,這些變量的值默認是dt_shmem jdbconn n(默認值表示使用共享內(nèi)存作為傳輸方式)。這些默認值不是我們需要的,Eclisep的遠程調(diào)試目前只支持套接字傳輸。在調(diào)用catalina.bat jpda start之前,我們給這些變量設(shè)置恰當(dāng)?shù)闹担?/p>

set JPDA_TRANSPORT=dt_socket
set JPDA_ADDRESS=8000
set JPDA_SUSPEND=y

call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

 

然后,直接執(zhí)行jpda.bat,Tomcat就運行在JPDA可調(diào)式模式下:

 

從上圖可以看出,Tomcat的JPDA使用套接字傳輸,監(jiān)聽在8000端口。Tomcat的啟動已經(jīng)暫停,只有調(diào)試器連接上來,才會繼續(xù)啟動。

 

我把jpda.bat的完整內(nèi)容列在下面,其中黑體部分,在startup.bat基礎(chǔ)上添加的代碼:

 


 

@echo off
if "%OS%" == "Windows_NT" setlocal
rem ---------------------------------------------------------------------------
rem Jpda script for the CATALINA Server
rem
rem $Id: jpda.bat 302918 2004-05-27 18:25:11Z yoavs $
rem ---------------------------------------------------------------------------

rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%
if not "%CATALINA_HOME%" == "" goto gotHome
set CATALINA_HOME=%CURRENT_DIR%
if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome
cd ..
set CATALINA_HOME=%cd%
cd %CURRENT_DIR%
:gotHome
if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome

set EXECUTABLE=%CATALINA_HOME%/bin/catalina.bat

rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find %EXECUTABLE%
echo This file is needed to run this program
goto end
:okExec

rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs

set JPDA_TRANSPORT=dt_socket
set JPDA_ADDRESS=8000
set JPDA_SUSPEND=y


call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

:end

 


 

 

在Eclipse中遠程調(diào)試Tomcat

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

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

 

首先確保已經(jīng)執(zhí)行了jpda.bat,Tomcat正在等待調(diào)試器連接;然后執(zhí)行上述的Debug Configuration,Eclipse就可以連上Tomcat。

 

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

 

 

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

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
]在Tomcat和Eclipse進行遠程調(diào)試的配置
JPDA 利用Eclipse和Tomcat進行遠程調(diào)試
使用 Eclipse 遠程調(diào)試 Java 應(yīng)用程序
Eclipse遠程調(diào)試(遠程服務(wù)器端監(jiān)聽)
tomcat設(shè)置遠程連接
遠程調(diào)試Tomcat7下的應(yīng)用
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服