Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法可以通过以下步骤实现:

  1. 在Idea中配置tomcat启动参数

首先需要在 Ieda 中配置 tomcat 的启动参数,具体方法为:

在Idea侧边栏中找到「Run/Debug Configuration」,点击「+」按钮,选择「Tomcat Server」,然后在「Server」选项中选择已配置好的 tomcat ,在「Configuration」选项中找到 「Before Launch」,添加一个 「Build」 的任务,最后点击 「Apply」 完成。

  1. 配置Remote Debug

接下来需要配置 Remote Debug,将 Idea 与 Tomcat 的启动过程与调试连接起来,具体方法如下:

在 Ieda 中找到 「Run/Debug Configuration」,并添加一个 Remote Configuration。

在「Name」中取一个有意义的名字,比如「Tomcat Remote Debug」。

在「Host」中输入 tomcat 所在主机 IP 地址,在「Port」中输入 tomcat 的 Remote Debug 端口(默认为 8000)。

最后点击 「Apply」 完成配置。

  1. 进入 Tomcat 源码调试

启动前先在 tomcat 的 bin 目录下找到 catalina.sh 文件,这个是 tomcat 启动脚本文件,在它的前面添加如下两行:

export JPDA_ADDRESS=8000
export JPDA_TRANSPORT=dt_socket

启动 tomcat:

./catalina.sh jpda run

这样就可以使用 Idea 连接到运行中的 tomcat ,在 tomcat 源码内部进行 Debug。

  1. 示例 1

比如修改 tomcat DefaultServlet 中 doGet 方法中的一个变量的值。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doHead(req, resp);
    PrintWriter writer = resp.getWriter();
    String root = req.getContextPath() == null ? "" : req.getContextPath();
    String accept = req.getHeader("accept");
    String pathInfo = req.getPathInfo() == null ? "" : RequestUtil.normalize(req.getPathInfo());
    boolean isDirectory = false;
    String guid = UUID.randomUUID().toString();
    ...(省略部分代码)...
    writer.println("<input id=\"guid\" type=\"hidden\" value=\"" + guid + "\"/>");
}

对输出内容的 guid 添加日志输出:

writer.println("<input id=\"guid\" type=\"hidden\" value=\"" + guid + "\"/>");
System.out.println("guid: " + guid);

在 Idea 中启动 Remote Debug 连接 tomcat 之后,按下 jsp 页面中的 F5 刷新。

在 tomcat 控制台中将看到输出的日志:

guid: 393fb527-2c45-4217-b242-d23cbe23b3e5
  1. 示例 2

以调试 tomcat 运行的 Manager 应用为例,进入方法源码调试:

在 tomcat 的 conf 目录下找到 tomcat-users.xml 文件,在其中添加一个具有 manager-gui 权限的用户账号:

平台管理 帐号及密码
<role rolename="manager-gui"/>
<user username="Tomcat" password="tomcat" roles="manager-gui"/>

在 tomcat 的 conf 目录下找到 context.xml 文件,启用一个 Manager 应用:

<Context path="/manager" docBase="${catalina.home}/webapps/manager" privileged="true" antiResourceLocking="false" antiJARLocking="false">
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^.*$" valveClass="org.apache.catalina.valves.RemoteIpValve"/>
  <Manager className="org.apache.catalina.session.PersistentManager">
    <Store className="org.apache.catalina.session.FileStore"/>
  </Manager>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

使用 manager 账号登录 Manage 应用:

访问地址:http://localhost:8080/manager/html ,输入 tomcat 的 manager-gui 权限的用户名和密码登陆管理页。

在 Ieda 中打开 tomcat-manager webapp 的 Servlet 源代码,比如用户列表页面“List users”:

文件路径:$TOMCAT_ROOT/webapps/manager/WEB-INF/classes/org/apache/catalina/manager/UsersServlet.java

通过 Idea Remote Debug Maven 引用 tomcat 的源代码,即可在自己电脑的 Idea 窗口中调试 tomcat 的 Manager 应用。

以上就是通过 Idea 中 tomcat 启动源码调试进入到 tomcat 内部进行调试的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java异常处理的五个关键字

    下面是“Java异常处理的五个关键字”的攻略: 异常处理的概念 Java 异常处理是一种机制,用于检测和处理代码中出现的错误或异常情况。当程序出现异常时,异常处理机制会终止当前的程序执行,并将异常信息传递给上层的代码,以便进行处理。 五个关键字 1. try try 语句块用于包含可能会抛出异常的代码。通常情况下,try 语句块后面会跟一个或多个 catch…

    Java 2023年5月27日
    00
  • SpringBoot整合FastDFS方法过程详解

    下面详细讲解SpringBoot整合FastDFS的方法。 简介 FastDFS是一个开源的轻量级分布式文件系统,它主要解决了海量图片、音视频等文件存储和访问的问题。Spring Boot是一种基于Spring框架的快速开发个性化应用的框架。本文将详细介绍Spring Boot如何整合FastDFS实现文件上传和下载功能。 步骤 1. 添加FastDFS依赖…

    Java 2023年5月19日
    00
  • spring retry实现方法请求重试的使用步骤

    下面我将详细讲解使用Spring Retry实现请求重试的使用步骤。 1. 引入Spring Retry 在Spring Boot中,我们可以通过在pom.xml中引入以下依赖来使用Spring Retry: <dependency> <groupId>org.springframework.retry</groupId>…

    Java 2023年5月20日
    00
  • 如何解决struts2日期类型转换

    解决struts2日期类型转换问题的完整攻略如下: 问题描述 在使用struts2框架中,如果后台 Action 接收的参数是日期类型,容易出现类型转换异常。例如,在前端页面中,日期类型通常采用字符串格式传递,如“2019-10-01”,但是在后台 Action 中,需要将该字符串转换为日期类型对象,否则无法正确处理业务逻辑。如果日期格式不一致,将会出现类型…

    Java 2023年6月2日
    00
  • Java面向对象基础知识之数组和链表

    Java面向对象基础知识之数组和链表 1. 数组和链表区别 数组和链表都是线性数据结构,但它们的存储方式和特点不同。 数组是一种连续的内存存储方式,可以快速访问任何一个元素。但在插入和删除元素时,需要移动大量元素,效率很低,因此不适合插入和删除操作频繁的情况。 链表是一种非连续的内存存储方式,每个元素存储了下一个元素的地址,因此可以快速插入和删除元素。但访问…

    Java 2023年5月26日
    00
  • java list与数组之间的转换详细解析

    Java List与数组之间的转换详细解析 在Java中,List是常用的数据结构之一,而数组也是Java中常用的数据结构。我们有时候需要在它们之间进行转换,本文将详细讲解Java List与数组之间的转换攻略。 1. 将List转换为数组 将List转换成数组需要注意以下几点: 首先,需要确定要转换的List的元素类型; 其次,需要创建一个与List元素类…

    Java 2023年5月26日
    00
  • Spring Kafka中如何通过参数配置解决超时问题详解

    下面我将为您详细讲解“Spring Kafka中如何通过参数配置解决超时问题”的攻略。 背景 在使用Spring Kafka时,如果遇到消费者无法及时消费Kafka消息而导致超时的问题,我们可以通过进行参数配置的方式来解决这个问题。 解决方案 下面是两条示例,以说明如何通过参数配置来解决超时问题: (1)示例一:通过consumer.timeout.ms来解…

    Java 2023年5月20日
    00
  • PHP Parse Error: syntax error, unexpected $end 错误的解决办法

    当PHP代码运行过程中发生了语法错误,导致编译器无法正确解析代码时,会出现“PHP Parse Error: syntax error, unexpected $end”错误。这一错误的出现会导致程序运行异常终止。本文将详细讲解此类错误的解决办法,帮助读者更好地理解和解决这种常见的错误。 原因分析 这种错误通常是由于编写代码时,存在以下几种问题导致的:1. …

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部