在Intellij下遠(yuǎn)程調(diào)試tomcat應(yīng)用(含tomcat源碼調(diào)試)

環(huán)境

服務(wù)器:

  • 操作系統(tǒng):centos6
  • jdk:1.7
  • tomcat:8.5.9

本地:

  • 操作系統(tǒng):mac osx 10.11.6
  • jdk:1.7
  • intellij:2016.2
  • tomcat:8.5.9(本地也需要下載tomcat)

應(yīng)用調(diào)試步驟

java應(yīng)用遠(yuǎn)程調(diào)試都是基于jpda體系帚称,所以我們需要將tomcat通過jpda的方式啟動(dòng),即可對(duì)tomcat進(jìn)行遠(yuǎn)程調(diào)試埋涧。

一碘勉、服務(wù)端tomcat配置

假設(shè)服務(wù)端tomcat所在目錄為:/etc/tomcat/巷挥。對(duì)于tomcat來說,所有運(yùn)行相關(guān)的腳本都位于bin文件夾下验靡,而catalina.sh是啟動(dòng)tomcat最為核心的腳本倍宾。為了使得tomcat能夠支持遠(yuǎn)程調(diào)試雏节,我們需要設(shè)置jpda相關(guān)的參數(shù),但是tomcat官方建議我們不要直接修改catalina.sh里面定義的參數(shù)高职,而是將自定義的參數(shù)值設(shè)置在setenv.sh腳本中钩乍,證據(jù)如下:

# Environment Variable Prerequisites
#
#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.

tomcat里定義的jpda參數(shù)有:

  • JPDA_TRANSPORT:設(shè)置jpda傳輸方式,默認(rèn)為dt_socket怔锌,此參數(shù)一般保持默認(rèn)值即可寥粹。
  • JPDA_ADDRESS:服務(wù)端jpda監(jiān)聽的地址和端口,默認(rèn)為localhost:8000埃元,即本地的8000端口涝涤。此參數(shù)需根據(jù)實(shí)際情況進(jìn)行修改。比如在本文場(chǎng)景中岛杀,我們需要遠(yuǎn)程調(diào)試tomcat阔拳,所以不能監(jiān)聽在本地,否則外網(wǎng)無法訪問楞件。
  • JPDA_SUSPEND:設(shè)置應(yīng)用程序是否一啟動(dòng)就掛起衫生,等待客戶端調(diào)試器連接,默認(rèn)為"n"也就是不掛起土浸,若需要設(shè)置為掛起則修改為"y"罪针。
  • JPDA_OPTS:若用戶設(shè)置了該參數(shù),則腳本執(zhí)行時(shí)會(huì)忽略上述三個(gè)參數(shù)黄伊,直接拿JPDA_OPTS的值作為jpda的啟動(dòng)參數(shù)泪酱。

默認(rèn)情況下,tomcat的jpda啟動(dòng)配置為:

-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n

我們需要根據(jù)自己的實(shí)際情況設(shè)置合適的參數(shù)还最,具體設(shè)置的步驟如下:

  1. 在bin文件夾下新建setenv.sh并編輯:

    # cd /etc/tomcat/bin
    # vim setenv.sh
    
  2. 設(shè)置JPDA_ADDRESS的值為0.0.0.0:8000

    JPDA_ADDRESS=0.0.0.0:8000
    

    保存退出墓阀。

  3. 以jpda的方式啟動(dòng)tomcat:

    # ./catalina.sh jpda start
    

此時(shí)tomcat已經(jīng)以jpda的方式啟動(dòng),并且向外網(wǎng)開放了8000端口等待客戶端發(fā)送調(diào)試命令拓轻。

二斯撮、Intellij配置

接下來我們需要配置intellij,具體步驟如下:

  1. 首先打開Run/Debug Configuration窗口:

  2. 點(diǎn)擊左上角的?號(hào)扶叉,添加一個(gè)Remote Tomcat:

  3. 填寫Server配置項(xiàng)勿锅,需要配置的有配置名稱、本地tomcat路徑以及tomcat所在的host和開放的端口:

  4. 配置debug所需的參數(shù)枣氧。在本例中溢十,由于我們?cè)诜?wù)端的tomcat配置的是dt_socket,端口為8000达吞,所以在這里我們也需要配置為socket和8000端口:

  5. 選擇剛才的配置(比如在本例中為開發(fā)機(jī))张弛,然后點(diǎn)擊debug圖標(biāo),打斷點(diǎn),開始遠(yuǎn)程調(diào)試:

調(diào)試tomcat源碼

在某些情況下吞鸭,我們需要調(diào)試tomcat自己的運(yùn)行情況寺董,比如為何應(yīng)用里配置的listener沒有加載成功,或者想研究tomcat的應(yīng)用機(jī)制瞒大,這個(gè)時(shí)候螃征,我們就需要直接調(diào)試tomcat的源碼搪桂。

一透敌、下載源碼

俗話說,巧婦難為無米之炊踢械,我們首先需要下載tomcat的源碼酗电。在本例中,我們tomcat的版本為8.5.9内列,下載地址請(qǐng)點(diǎn)擊撵术。下載成功后解壓,我們假設(shè)源碼目錄位于:~/tomcat/话瞧。

二嫩与、導(dǎo)入源碼

我們需要將源碼導(dǎo)入到intellij中,為接下來的調(diào)試打好基礎(chǔ)交排。

  1. 下載下來的tomcat是一個(gè)ant工程划滋,為了方便,我們首先將其轉(zhuǎn)化為一個(gè)maven工程埃篓,這樣我們就不需要關(guān)心依賴包的下載問題处坪。我們?cè)谠创a目錄下新建pom.xml文件,pom的內(nèi)容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>Tomcat8.0</artifactId>
        <name>Tomcat8.0</name>
        <version>8.0</version>
    
        <build>
            <finalName>Tomcat8.0</finalName>
            <sourceDirectory>java</sourceDirectory>
            <testSourceDirectory>test</testSourceDirectory>
            <resources>
                <resource>
                    <directory>java</directory>
                </resource>
            </resources>
            <testResources>
                <testResource>
                    <directory>test</directory>
                </testResource>
            </testResources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3</version>
    
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>ant</groupId>
                <artifactId>ant</artifactId>
                <version>1.7.0</version>
            </dependency>
            <dependency>
                <groupId>wsdl4j</groupId>
                <artifactId>wsdl4j</artifactId>
                <version>1.6.2</version>
            </dependency>
            <dependency>
                <groupId>javax.xml</groupId>
                <artifactId>jaxrpc</artifactId>
                <version>1.1</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.jdt.core.compiler</groupId>
                <artifactId>ecj</artifactId>
                <version>4.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.easymock/easymock -->
            <dependency>
                <groupId>org.easymock</groupId>
                <artifactId>easymock</artifactId>
                <version>3.2</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
  2. 然后我們將源碼導(dǎo)入到intellij中:

    在彈出來的對(duì)話框中選擇剛才源碼所在的目錄架专,并且作為Maven工程導(dǎo)入同窘,即可導(dǎo)入成功。

  3. 為了避免待會(huì)執(zhí)行test時(shí)出現(xiàn)問題部脚,我們需要?jiǎng)h除test/util/TestCookieFilter.java文件想邦。

三、配置遠(yuǎn)程調(diào)試

配置步驟與第二部分介紹的配置步驟相同委刘。唯一需要注意的是丧没,服務(wù)端的tomcat在配置jpda參數(shù)時(shí),可以將JPDA_SUSPEND設(shè)置為y钱雷,這樣tomcat啟動(dòng)之后不會(huì)執(zhí)行任何代碼骂铁,而是掛起,直到客戶端連上來后才會(huì)繼續(xù)執(zhí)行罩抗。

其他

如果存在服務(wù)端jpda已經(jīng)啟動(dòng)拉庵,但是客戶端無法連接的情況,請(qǐng)檢查防火墻套蒂。

參考資料

  1. Tomcat8源碼學(xué)習(xí)之導(dǎo)入到IDEA
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钞支,一起剝皮案震驚了整個(gè)濱河市茫蛹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烁挟,老刑警劉巖婴洼,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撼嗓,居然都是意外死亡柬采,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門且警,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粉捻,“玉大人,你說我怎么就攤上這事斑芜〖缛校” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵杏头,是天一觀的道長(zhǎng)盈包。 經(jīng)常有香客問我,道長(zhǎng)醇王,這世上最難降的妖魔是什么呢燥? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮厦画,結(jié)果婚禮上疮茄,老公的妹妹穿的比我還像新娘。我一直安慰自己根暑,他們只是感情好力试,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著排嫌,像睡著了一般畸裳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淳地,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天怖糊,我揣著相機(jī)與錄音,去河邊找鬼颇象。 笑死伍伤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遣钳。 我是一名探鬼主播扰魂,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了劝评?” 一聲冷哼從身側(cè)響起姐直,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋畜,沒想到半個(gè)月后声畏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姻成,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年插龄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣渴。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辫狼,死狀恐怖初斑,靈堂內(nèi)的尸體忽然破棺而出辛润,到底是詐尸還是另有隱情,我是刑警寧澤见秤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布砂竖,位于F島的核電站,受9級(jí)特大地震影響鹃答,放射性物質(zhì)發(fā)生泄漏乎澄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一测摔、第九天 我趴在偏房一處隱蔽的房頂上張望置济。 院中可真熱鬧,春花似錦锋八、人聲如沸浙于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羞酗。三九已至,卻和暖如春紊服,著一層夾襖步出監(jiān)牢的瞬間檀轨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工欺嗤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留参萄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓煎饼,卻偏偏與公主長(zhǎng)得像讹挎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容