Tomcat 源码分析一 :快速搭建 Debug 环境

Easter79
• 阅读 975

最近不是特别忙,空闲之余就开始倒腾Tomcat源码了,之前也陆陆续续看过一点,翻过 《How tomcat works》这本书。这次想趁着有时间,系统性的好好分析下Tomcat的源码。

分析源码的第一步自己是先搭建debug环境,我之前选择的是先下载Tomcat源码,然后通过Tomcat文档里面写的方法,使用ant构建,发现中间需要用很长的时间,中间经常提示构建失败(比如下载依赖的jar包失败等)。想到之前在开发环境的时候,经常使用idea的远程debug来调试测试环境的代码。显然我们本地的tomcat和测试环境的tomcat都一样,在idea或eclipse中都是Remote debug。笔者的环境是 windows, 使用linux的小伙伴稍微做调整即可(比如windows使用 catalina.bat, linux 使用 catalina.sh)

一、启动 Tomcat

首先下载Tomcat的可运行包,我这里下载的是 8.0.24 的版本,然后启动tomcat,当然我们需要debug,可以参考idea/eclipse模式,先把jvm挂起,等待远程debug的连接。

setenv.bat

tomcat的作者也想到了我们会debug tomcat, 在catalina.bat中也提供了强大的支持。

在bin目录下新建 setenv.bat

Tomcat 源码分析一 :快速搭建 Debug 环境

注意一定要是这个名字,因为在 catalina.sh 中是写死了这个名字的。然后输入以下内容:

set JPDA_SUSPEND=y

很简单,就是设置一个变量。然后在bin目录下启动tomcat debug环境:

catalina.bat jpda start

然后就看见 jvm 挂起,等待我们的远程 debug了。可以看到控制台提示:

Listening for transport dt_socket at address: 8000

感兴趣的小伙伴可以去阅读一下 catalina.bat 这个脚本,其实就是利用了jvm debug参数。这里推荐不去直接修改 catalina.bat 文件。

-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

suspend 参数默认为 n, 即开启debug但是默认在启动的时候,如果没有debug 连接,不挂起 jvm, 我们设置了 y, 即挂起jvm, 因为我们想看整个 tomcat的启动过程。(idea/eclipse的debug也是这个原理)

二、IDE remote debug
配置源码

Remote debug 最重要的是需要有源代码,那么Tomcat的源码我们用什么方式导入最好呢,这里想到了 Maven, tomcat 发行了 embed 版本的jar, 里面包含了tomcat的源码,所以利用 maven 项目可以很方便的关联debug源码。

在idea/eclipse中新建一个maven项目,然后引入以下依赖:

    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.0.24</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-logging-juli</artifactId>
            <version>8.0.24</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
配置remote debug

我这边使用的是 idea , 使用eclipse的小伙伴如果不知道怎么配置remote debug自行搜索一下哈:

  1. edit configurations
  2. 左上角 + 号,然后选择 remote
  3. 填写调试的地址和端口,默认是 localhost 8080

配置如图:

Tomcat 源码分析一 :快速搭建 Debug 环境

点击保存。 因为我们需要了解整个tomcat的启动过程,所以先找到 Main 函数入口,在catalina.bat 中我们知道,这个Main函数入口是在 Bootstrap 类中。所以我们找到这个类的Main方法然后在第一行打一个断点:

Tomcat 源码分析一 :快速搭建 Debug 环境

然后点击工具栏的 debug按钮,啊哈~ 断点进来啦。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
tomcat源码分析
摘要:在阅读tomcat源码前,我们一般都会有如下几个疑问:web容器和servlet容器的区别是什么;在springMVC中的web.xml是什么时候加载到tomcat中的;tomcat是怎么加载我们的web服务的;tomcat是怎么实现的热部署;一个http请求1.前言1.1问题思考在阅读tomcat源码前,我们
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
tomcat源码导入eclipse
1\.去apache官网下载对应的tomcat版本源码 https://tomcat.apache.org/download70.cgi2\.解压,用ant进行编译,本地没有ant就去ant官网下载ant对应版本。http://ant.apache.org/bindownload.cgi(https://www.oschina.net/act
Stella981 Stella981
3年前
HashMap源码分析 JDK1.8
本文按以下顺序叙述:HashMap的感性认识.官方文档中对HashMap介绍的解读.到源码中看看HashMap这些特性到底是如何实现的.把源码啃下来有一种很爽的感觉,相信你读完后也能体会到~如发现有误,欢迎指出.<h3id1在开始之前,先通过图例对HashMap建立感性认识</h3
Stella981 Stella981
3年前
CVE
本文借助CVE20209484Tomcat漏洞详细的介绍了本地和远程调试Tomcat源码。分析漏洞成因以及补丁修补情况,以及分析ysoserial反序列化链。0x01漏洞简介ApacheTomcat发布通告称修复了一个源于持久化Session的远程代码执行漏洞(CVE20209484)。漏洞条件比较苛刻:tomcat必须启
Easter79 Easter79
3年前
Tomcat源码构建可运行的Tomcat
Tomcat是大家熟悉的JavaEE容器,我们使用的时候通常都是直接下载.exe的安装包或者.zip的压缩文件,今天特意参考官方文档来用源码构建,并在这里记录下构建的过程。1\.下载Tomcat源码可从以下地址选择更多的Tomcat版本:http://archive.apache.org/dist/tomcat
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Easter79 Easter79
3年前
Tomcat9.0环境搭建与源码编译
使用IntelliJIDEA 搭建Tomcat9.0项目准备条件:下载源码这里我们下载的Tomcat的源码版本是9.0.12。下载地址:https://tomcat.apache.org/download90.
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k