`

Eclipse+Tomcat远程调试配置

阅读更多

转载于:http://blog.csdn.net/jarfield/article/details/5250915

 

 

最近,一直在研究Tomcat的工作内幕,主要的方法就是参考《How Tomcat Works》 这本书和Tomcat 5.5.26的源代码。

 

Tomcat的代码结构还是比较清晰的,注释也比较全。但是代码毕竟是静态的,难以彻底弄清类与类之间的协作关系,以及运行时对象的交互关系。

 

如果能对Tomcat的启动、处理请求和停止的过程进行断点调试,看清Tomcat的每一步行踪,那么就能解决上面的问题了。

 

于是,又一个问题出来了:如何使用Eclipse远程调试Tomcat ?

 

上网查了一些资料,相关的文章还是很多的。我简单梳理了一下解决方案及原理,顺便熟悉了Tomcat的启动脚本。

 

如何远程调试JVM?

远程调试Tomcat,本质上就是远程调试JVM。倒不是需要了解JVM自身的运行细节,而是要了解JVM上应用程序的运行细节。

无论如何,我们都要获取JVM运行时的内部信息(比如查看调试信息),并对JVM的运行流程进行控制(比如单步执行),才能达到调试的目的。

 

这个事情光靠调试器本身,肯定是做不到的。不然,JVM的安全性就大打折扣了。除非JVM提供某种“后门”,供调试器查询一些运行时信息,并允许调试器发送一些控制命令。

 

不得不感慨,JVM的强大。从J2SE 1.4.2开始,就已经提出并实现了JavaTM Platform Debugger Architecture ,简称JPDA。

 

JPDA简介

顾名思义,JPDA为Java平台上的调试器定义了一个标准的体系结构。该体系结构包括3个主要组成部分:JVM TI、JDI和JDWP。

 

JVM TI的全称是Java Virtual Machine Tool Interface,它定义了JVM为了支持调试而必须提供的功能及相应的访问接口。这些访问接口是以本地语言的形式提供的,由JVM(比如Sun公司的HotSpot VM)负责实现。

不过,JVM TI只是JVM提供的一系列函数,调试器(特别是远程的调试器)如何调用呢?其实啊,JVM TI的直接客户端并不是调试器,而是一个称为“JPDA back-end”的东东。这个东东应该是属于JVM的一部分,在SUN JRE的bin目录下可以找到jdwp.dll(jdwp.so)的库文件,这就是JPDA back-end的实现。按我理解,JPDA back-end提供了各种访问方式(共享内存,Socket),通过这些方式接收调试器的请求,然后调用JVM TI接口。

 

JDI的全称是Java Debug Interface,它定义了访问JVM TI接口的高层API,以纯Java语言提供,由JDK实现(在Sun JDK的tools.jar可以找到)。调试器直接使用JDI来实现调试的功能。与JPDA back-end相对应,JDI实现的角色就是JPDA front-end。

 

JDWP的全称是Java Debug Wire Protocol,它定义了JPDA front-end和JPDA back-end之间通讯信息的二进制格式。这里的通讯信息主要包括两种:调试器发送给JVM的请求信息和JVM发送给调试器的调试信息。

 

总结一下,调试器 调用JDK提供的JDI实现 (JPDA front-end),经由JDWP协议 ,和JVM自带的JPDA back-end (jdwp.dll, jdwp.so, ...)进行通讯。JPDA back-end 通过调用JVM TI接口 ,从而获知调试信息,或发送控制命令。然后,JPDA back-end 将调试信息或命令执行结果,通过JDWP协议 ,返回给调试器 。

 

如何启用JPDA

默认情况下,JVM并没有启用JPDA back-end。需要在启动JVM的命令行加载以下参数:

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

 

-Xdebug

启用调试特性

-Xrunjdwp

启用JDWP实现,它包含若干子选项:

transport=dt_socket

JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

address=8000

JVM在8000端口上监听请求。

server=y

y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。

suspend=y

y表示启动的JVM会暂停等待,直到调试器连接上。

 

suspend=y这个选项很重要。如果你想从Tomcat启动的一开始就进行调试,那么就必须设置suspend=y。

 

Tomcat的启动脚本

只要Tomcat启动时,启用了JPDA,那么就可以被调试。而Tomcat默认是不启用JPDA的,需要我们手动开启。

 

开启JPDA的方法也很简单,对Tomcat的启动脚本做点修改,把启动JPDA的命令行参数添加进去,就可以了。

 

不过Tomcat启动脚本还是有点复杂的,并不是简单的”java ...“。我们先简单的梳理一下。

 

在Tomcat 5.5.26发行版的bin目录下,有N多脚本,其中与Tomcat启停有关的脚本是(以Windows为例):

startup.bat        //启动Tomcat

shutdown.bat   //停止Tomcat

catalina.bat       //包含启动/停止Tomcat的核心逻辑

 

startup.bat和shutdown.bat都是通过调用catalina.bat来实现启动和停止的功能,因此他俩的代码都很少。主要的逻辑都在catalina.bat中。

 

catalina.bat是个强大的脚本,通过参数,可以执行各种动作,包括debug run start stop version等。

如果我们直接执行catalina.bat,就可以看到它的用法说明:

 

直接执行catalina.bat时的输出

 

startup.bat,其实就是执行catalina.bat start;shutdown.bat,其实就是执行catalina.bat stop。

不难猜到,我们可以写一个jdpa.bat,直接调用catalina.bat jpda start,应该就可以启用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,这些选项参数怎么传递给catalina.bat呢?

看看catalina.bat前面的注释,server的值默认就是y,transport的值是变量JPDA_TRANSPORT,address的值是变量JPDA_ADDRESS,suspend的值是变量JPDA_SUSPEND 。如果没有显式地复制,这些变量的值默认是dt_shmem jdbconn n(默认值表示使用共享内存作为传输方式)。这些默认值不是我们需要的,Eclisep的远程调试目前只支持套接字传输。在调用catalina.bat jpda start之前,我们给这些变量设置恰当的值:

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

call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

 

然后,直接执行jpda.bat,Tomcat就运行在JPDA可调式模式下:

启用JPDA的Tomcat

 

从上图可以看出,Tomcat的JPDA使用套接字传输,监听在8000端口。Tomcat的启动已经暂停,只有调试器连接上来,才会继续启动。

 

我把jpda.bat的完整内容列在下面,其中黑体部分,在startup.bat基础上添加的代码:

 

 


 

@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中远程调试Tomcat

首先将Tomcat 5.5.26的源代码分为container connectors jasper servletapi build五个项目,导入到Eclipse中。启动相关的代码主要在container中,就以它为当前项目,打开”Debug Configurations“对话框。

然后创建一个”Remote Java Application“,Connection Type选择”Standard (Socket Attach)“,Host填写localhost(Tomcat所在的主机地址),Port填写8000。最后点击”Apply“保存。

Eclipse的Debug Configurations对话框中配置远程调试

 

首先确保已经执行了jpda.bat,Tomcat正在等待调试器连接;然后执行上述的Debug Configuration,Eclipse就可以连上Tomcat。

 

Tomcat的启动是从Bootstrap的main方法开始,我在第一行代码处设置了断点,Tomcat的启动就停在了这一行:

 

断点调试Tomcat的启动过程

 

接着,让Tomcat继续执行,我们可以看到,控制台输出了启动信息。

Tomcat在JPDA模式下继续启动

分享到:
评论

相关推荐

    eclipse远程调试tomcat

    ### Eclipse远程调试Tomcat知识点...本文详细介绍了如何在Eclipse中配置并执行Tomcat的远程调试。通过上述步骤,你可以轻松地在远程服务器上调试Java Web应用程序,从而提高开发效率和质量。希望这些内容对你有所帮助!

    WebLogic+Tomcat远程调试

    #### 二、Tomcat远程调试配置步骤 **1. Windows系统下的配置** - 打开`%CATALINA_HOME%\bin`目录下的`catalina.bat`文件。 - 在文件中加入以下行: ```cmd set CATALINA_OPTS=-server -Xdebug -Xnoagent -D...

    tomcat远程debug与jrebel热部署文件

    首先,Tomcat远程调试允许开发者在不重启服务器的情况下定位并修复代码中的问题。这对于大型项目和持续迭代的环境尤其重要,因为它可以避免因为频繁重启服务器而造成的系统中断。要启用远程调试,你需要在`catalina....

    Lomboz-Eclipse+TOMCAT插件教程

    总结来说,Lomboz-Eclipse+TOMCAT插件教程主要涵盖了如何在Eclipse环境中安装和使用Lomboz插件,配置和管理Tomcat服务器,以及创建、调试和部署Java Web应用的全过程。通过这个教程,开发者可以提升工作效率,更好地...

    Eclipse远程调试Tomcat

    标题 "Eclipse远程调试Tomcat" 指的是在Eclipse集成开发环境中,通过远程调试功能连接并调试在另一台机器上运行的Tomcat服务器。这通常用于在生产环境或测试环境中定位和修复代码问题,而无需直接在该环境中安装IDE...

    Eclipse 远程调试Tomcat的应用

    本文将深入探讨如何配置Eclipse以远程调试部署在Tomcat上的应用,通过详细步骤和参数解析,帮助开发者有效定位和解决问题。 #### 二、Tomcat服务端配置 要在远程服务器上的Tomcat中启用远程调试功能,首先需要对...

    使用Eclipse远程调试Linux服务器Tomcat项目

    为使用Eclipse远程调试Linux服务器Tomcat项目,需要在Linux服务器上配置Tomcat。首先,在Tomcat的bin目录下找到catalina.sh文件,并在第一行增加以下代码: CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,...

    eclipse+maven+tomcat集成

    ### Eclipse + Maven + Tomcat 集成 #### 一、Maven的安装与配置 Maven是一款跨平台的项目管理工具,它主要用于基于Java平台的项目构建、依赖...同时,Eclipse与Tomcat的集成使得项目的调试和测试变得更加便捷高效。

    贯通Java Web开发三剑客Eclipse+Tomcat+Ant整合开发.(党海峰)

    1. **Eclipse与Tomcat集成**:设置Eclipse以使用内置或外部Tomcat服务器,创建Web项目,配置服务器属性,以及在Eclipse内启动和调试应用程序。 2. **Ant的使用**:学习Ant的基本结构,如`<project>`、`<target>`和`...

    ECLIPSE+WEB开发配置

    对于远程调试,Eclipse可以配置连接到远程的JBoss服务器,使得开发者可以在本地环境中解决生产环境的问题。 Eclipse+SVN则涉及到版本控制。Subversion(SVN)是一种流行的版本控制系统,用于跟踪文件和目录的变更。...

    eclipse3+struts+tomcat

    7. **测试与调试**:掌握使用Eclipse 3进行单元测试和集成测试的方法,以及如何在Tomcat服务器上进行远程调试,以确保Struts应用的正确运行。 通过这个教程,读者将能够从零开始构建一个基本的Struts应用,并在...

    使用Tomcat+Eclipse远程Debug

    本文将详细介绍如何通过Eclipse集成开发环境(IDE)配合Apache Tomcat应用服务器实现远程调试的功能。 #### 二、准备工作 在开始配置之前,请确保已经安装了以下组件: - **Eclipse IDE**:推荐使用最新版Eclipse...

    [JAVAWEB教程]jsp环境搭建+部署网站(eclipse+tomcat)[详细+图文].doc

    【JAVAWEB教程】- JSP环境搭建与网站部署(Eclipse + Tomcat) 在进行JavaWeb开发时,一个良好的开发环境是必不可少的。本教程将指导你如何使用Eclipse IDE和Apache Tomcat服务器搭建JSP开发环境,并部署你的网站。...

    Tomcat下配置远程调试

    ### Tomcat下配置远程调试 #### 一、引言 在软件开发过程中,为了更好地调试应用程序,特别是对于复杂的系统架构,远程调试成为一种常见的技术手段。通过远程调试,开发人员可以在本地环境中对部署在服务器上的...

    jvm tomcat eclipse 远程 断点 debug 调试 jpda

    2. **Tomcat远程调试** Tomcat作为一个流行的Java应用服务器,同样支持远程调试。在`catalina.sh`启动脚本中,可以通过添加`jpda start`命令来启动Tomcat,并启用调试模式。默认情况下,Tomcat会使用JDWP进行调试...

    eclipse中远程调试tomcat应用

    总之,Eclipse的远程调试功能结合Tomcat的配置,为Java Web应用的开发和调试提供了一个便捷的解决方案。通过深入理解和熟练运用这些技巧,开发者能够更高效地排查和修复代码问题,从而提升软件的质量和稳定性。

    在Tomcat和Eclipse进行远程调试的配置

    ### 在Tomcat与Eclipse中进行远程调试的配置详解 #### 概述 在软件开发过程中,特别是对于大型分布式系统而言,远程调试是一项非常重要的技能。它能够帮助开发者跨越地理位置限制,有效地解决线上环境中出现的问题...

    eclipse与tomcat、weblogic远程调试小结(windows系统)

    2. **Tomcat远程调试配置**: - 下载并安装Tomcat服务器。 - 编辑Tomcat的`bin/catalina.sh`(或`catalina.bat`,取决于你的操作系统)文件。 - 在`CATALINA_OPTS`变量中添加以下参数以启用远程调试: ```bash ...

    在Tomcat和Eclipse进行远程调试的配置.doc

    本文将详细介绍如何在Tomcat和Eclipse环境中配置远程调试。 首先,我们来看Tomcat的配置。Tomcat是一个流行的开源Java Servlet容器,它用于部署和运行Java Web应用程序。在Windows和非Windows系统(如Linux或Mac OS...

Global site tag (gtag.js) - Google Analytics