在Intellij下远程调试tomcat应用(含tomcat源码调试)

环境

服务器:

  • 操作系统:centos6
  • jdk:1.7
  • tomcat:8.5.9

本地:

  • 操作系统:mac osx 10.11.6
  • jdk:1.7
  • intellij:2016.2
  • tomcat:8.5.9(本地也需要下载tomcat)

应用调试步骤

java应用远程调试都是基于jpda体系,所以我们需要将tomcat通过jpda的方式启动,即可对tomcat进行远程调试。

一、服务端tomcat配置

假设服务端tomcat所在目录为:/etc/tomcat/。对于tomcat来说,所有运行相关的脚本都位于bin文件夹下,而catalina.sh是启动tomcat最为核心的脚本。为了使得tomcat能够支持远程调试,我们需要设置jpda相关的参数,但是tomcat官方建议我们不要直接修改catalina.sh里面定义的参数,而是将自定义的参数值设置在setenv.sh脚本中,证据如下:

# 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参数有:

  • JPDA_TRANSPORT:设置jpda传输方式,默认为dt_socket,此参数一般保持默认值即可。
  • JPDA_ADDRESS:服务端jpda监听的地址和端口,默认为localhost:8000,即本地的8000端口。此参数需根据实际情况进行修改。比如在本文场景中,我们需要远程调试tomcat,所以不能监听在本地,否则外网无法访问。
  • JPDA_SUSPEND:设置应用程序是否一启动就挂起,等待客户端调试器连接,默认为"n"也就是不挂起,若需要设置为挂起则修改为"y"。
  • JPDA_OPTS:若用户设置了该参数,则脚本执行时会忽略上述三个参数,直接拿JPDA_OPTS的值作为jpda的启动参数。

默认情况下,tomcat的jpda启动配置为:

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

我们需要根据自己的实际情况设置合适的参数,具体设置的步骤如下:

  1. 在bin文件夹下新建setenv.sh并编辑:

    # cd /etc/tomcat/bin
    # vim setenv.sh
    
  2. 设置JPDA_ADDRESS的值为0.0.0.0:8000

    JPDA_ADDRESS=0.0.0.0:8000
    

    保存退出。

  3. 以jpda的方式启动tomcat:

    # ./catalina.sh jpda start
    

此时tomcat已经以jpda的方式启动,并且向外网开放了8000端口等待客户端发送调试命令。

二、Intellij配置

接下来我们需要配置intellij,具体步骤如下:

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

  2. 点击左上角的➕号,添加一个Remote Tomcat:

  3. 填写Server配置项,需要配置的有配置名称、本地tomcat路径以及tomcat所在的host和开放的端口:

  4. 配置debug所需的参数。在本例中,由于我们在服务端的tomcat配置的是dt_socket,端口为8000,所以在这里我们也需要配置为socket和8000端口:

  5. 选择刚才的配置(比如在本例中为开发机),然后点击debug图标,打断点,开始远程调试:

调试tomcat源码

在某些情况下,我们需要调试tomcat自己的运行情况,比如为何应用里配置的listener没有加载成功,或者想研究tomcat的应用机制,这个时候,我们就需要直接调试tomcat的源码。

一、下载源码

俗话说,巧妇难为无米之炊,我们首先需要下载tomcat的源码。在本例中,我们tomcat的版本为8.5.9,下载地址请点击。下载成功后解压,我们假设源码目录位于:~/tomcat/

二、导入源码

我们需要将源码导入到intellij中,为接下来的调试打好基础。

  1. 下载下来的tomcat是一个ant工程,为了方便,我们首先将其转化为一个maven工程,这样我们就不需要关心依赖包的下载问题。我们在源码目录下新建pom.xml文件,pom的内容如下:

    <?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. 然后我们将源码导入到intellij中:

    在弹出来的对话框中选择刚才源码所在的目录,并且作为Maven工程导入,即可导入成功。

  3. 为了避免待会执行test时出现问题,我们需要删除test/util/TestCookieFilter.java文件。

三、配置远程调试

配置步骤与第二部分介绍的配置步骤相同。唯一需要注意的是,服务端的tomcat在配置jpda参数时,可以将JPDA_SUSPEND设置为y,这样tomcat启动之后不会执行任何代码,而是挂起,直到客户端连上来后才会继续执行。

其他

如果存在服务端jpda已经启动,但是客户端无法连接的情况,请检查防火墙。

参考资料

  1. Tomcat8源码学习之导入到IDEA
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容