Tomcat Remote Debug操作和原理

时间:2022-09-10 17:28:40

操作篇

这部分主要讲,如何开启tomcat远程调试,并佐以实例。本文方式适用于windows和linux。

假设有两台机器,A是tomcat服务器所在机器,B是IDE安装机器。A和B可以是同一台机器,通常A是测试环境,B是开发环境。

简洁版本

在A机器的tomcat/bin/文件夹中,新建文件setenv.bat(或者setenv.sh,根据你的操作系统),输入:

export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

保存文件。启动startup.bat(或者startup.sh)。

在B机器上,启动IDE Intellij Idea。

在run中打开edit configurations

Tomcat Remote Debug操作和原理

点击左边绿色的加号,选择remote

Tomcat Remote Debug操作和原理

输入IP地址和端口。

在程序中设置断点,刷新web页面,即可触发断点进行调试。[end]

简洁版本解释

在测试环境启用Tomcat Remote Debug模式

Tomcat启动远程调试非常简单,只需要在JVM启动参数中设置下变量即可。

上面所做的事情,也就是在设置下JVM的启动参数。

根据Intellij Idea的提示:

Tomcat Remote Debug操作和原理

对于JDK1.5以上的版本,JVM参数是:

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

对于JDK1.4版本,使用:

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

再老的版本,就不用再列出,实际中也很少遇到了。

为什么Intellij给出不同版本的JDK,需要使用不同的JVM参数,*上是这么解释的:

Before Java 5.0, use -Xdebug and -Xrunjdwp arguments. These options will still work in later versions, but but it will run in interpreted mode instead of JIT, which will be slower.

From Java 5.0, it is better to use the -agentlib:jdwp single option:

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

Options on -Xrunjdwp or agentlib:jdwp arguments are :

  • transport=dt_socket : means the way used to connect to JVM (socket is a good choice, it can be used to debug a distant computer)
  • address=8000 : TCP/IP port exposed, to connect from the debugger,
  • suspend=y : if 'y', tell the JVM to wait until debugger is attached to begin execution, otherwise (if 'n'), starts execution right away.

该答案解释了,使用-Xdebug方式,主要是在交互模式下适用,它在性能上会弱于使用-agentlib方式。

同时,该答案还解释了相应的三个参数:

transport:有两种形式,分别是socket和shared memory,需要跨机器,只能用socket

address:端口号,这里采用的是tcp协议。我们可以使用

cat /etc/services | grep ''

来查看该端口是否开启

suspend:如果是y,则需要等B机器上的debugger开启后,程序才会开始运行。否则,程序启动时候不会挂起,直接运行。

tomcat官方文档中,使用的脚本是:

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

也就是Intellij Idea给出的JDK1.4的版本。不过tomcat官方文档中,也给出了

catalina jpda start

后面这种方式,其实是触发了tomcat中的catalina脚本:

if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="localhost:8000"
fi
if [ -z "$JPDA_SUSPEND" ]; then
JPDA_SUSPEND="n"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
fi
CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
shift
fi

该脚本会读取自定义参数(如果存在),作为启动JPDA的参数。默认的端口号是8000.

设置tomcat的JVM参数

设置参数有多种方式,其本质是修改catalina中的JAVA_OPTS值,也就是JVM的启动参数。

一种方式是,直接在catalina中设置该值。不过这种方法,hardcode了catalina文件,属于not recommend方式。

根据Oracle官方文档的说明:

推荐的方式是,在tomcat/bin目录下,新建一个setenv.bat(或者startup.sh,根据你的操作系统),并写入需要设置的参数。

这种推荐的方式,反应在catalina中的代码是:

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed. CLASSPATH= if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
. "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
. "$CATALINA_HOME/bin/setenv.sh"
fi

catalina脚本会去先从setenv中读取环境变量。

最后,启动startup即可。

原理篇

核心是JPDA(Java Platform Debugger Architecture)框架。IBM有非常详细的介绍:

https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/

https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/

https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/

https://www.ibm.com/developerworks/cn/java/j-lo-jpda4/

关键摘抄如下:

  1. JPDA是JVM的调试标准,任何JDK都必须实现。
  2. 调试Java程序,本质是向JVM请求当前状态。这需要对JVM发送一定指令,设置一定回调。
  3. JPDA的三个层次:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。它们之间的角色图:

Tomcat Remote Debug操作和原理

  1. JVMTI(Java Virtual Machine Tool Interface):通向JVM的native的接口,处于体系最底层。所有的调试功能都需要该接口提供。是debug和profiler的接口,是线程分析、监听和代码覆盖率检查的基础。会有个紧耦合的Agent来实现JVMTI。该Agent的加载时间是出于JVM初始化早期或者运行时加载(对应于上文中的suspend参数)。
  2. JDWP(Java Debug Wire Protocol):交互的通讯协议。定义了交互中的命令、回应数据和错误代码。不包含传输层具体实现。主要分为握手和应答两个阶段。
  3. JDI(Java Debug Interface):对JDWP进行解析,为JDWP提供队列、缓存等服务。分为数据模块,将虚拟机上的所有数据、状态映射为Java的数据对象;链接模块,调试器向虚拟机发起链接,以获得各种状态,分为主动和被动形式。事件请求和处理模块。
  4. 由于JVM神一般的存在,使得Java的运行是先天可控的,因此其调试程序的开发,也远容易与C++。
  5. 类似工具:Apache harmony

Tomcat Remote Debug操作和原理的更多相关文章

  1. vscode local attach 和 remote debug

    VSCode是MS推出的一款免费的开源并跨平台的轻量级代码编辑器,内置Git和Debug等常用功能,强大的插件扩展功能以及简单的配置几乎可以打造成任意编程语言的IDE.本文简单聊一下其本地attach ...

  2. Tomcat源码分析——请求原理分析(中)

    前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...

  3. JVM调优(四)——tomcat远程debug

    JVM调优(四)--tomcat远程debug tomcat远程debug jdwp协议 使用步骤 登录远程服务器,进入tomcat目录,并打开文件: //tomcat/bin/startup.sh ...

  4. Tomcat 启动 Debug模式

    如果debug启动遇到如下错误: ERROR: transport error 202: gethostbyname: unknown host ERROR: JDWP Transport dt_so ...

  5. Atitit web remote远程调试的原理attilax总结

    Atitit web remote远程调试的原理attilax总结 Jvm是vm打开一个debug port,然后ide先连接..然后执行url,就会vm会与ide沟通.. Php的xdebug po ...

  6. QT Creator 环境使用 remote debug 调试 arm 程序

    这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功.没有调试手段比较痛苦,今天又花了点时间,居然搞定了.粗做记录. 工具版本: 1. QtCrea ...

  7. Tomcat源码分析——请求原理分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

  8. 排障利器之远程调试与监控 --jmx &amp&semi; remote debug

    监控和调试功能是应用必备的属性之一,其手段也是多种多样. 一般地,我们可以通过:线上日志, zabbix, grafana, cat 等待系统做一问题留底,有问题及时报警,从而达到监控效果. 而对于应 ...

  9. iOS web remote debug 正确的姿势

    在使用iOS Remote debug需要做以下准备 1. iOS devices 开启java script and web inspector 开启方式如下: 2. mac OS 自带的Safar ...

随机推荐

  1. appzapper注册码

    Appzapper for mac是MAC OS上的一款软件,可以非常方便的卸载自己不喜欢的软件,非常的快速便捷,卸载的时候不会有残留. 下载地址:http://www.pc6.com/mac/114 ...

  2. js实现发送短信验证码后的倒计时功能&lpar;无视页面刷新&rpar;

    [1].[代码] 这是页面上的发送验证码按钮 跳至 [1] [2] [3]<input id="second" type="button" value=& ...

  3. UML&colon; 状态机图

    摘自http://www.umlonline.org/school/viewthread.php?tid=39 活动图将流程分解为一个一个的活动,通过活动的先后顺序来展示流程:而状态机图从某个物品的状 ...

  4. &lpar;java&rpar;&equals;&equals;和equals&lpar;&rpar;的使用小结

    1.如果两个变量说基本数据类型,且都是数值类型,eg.65f,65(不一定要求数据类型严格相同),只要两个变量的值相等,就将返回true int it=65; float fl=65.0f; char ...

  5. 十个拥有丰富UI组件的JS开发框架

    如今,网上有各种各样的 JavaScript 框架用来简化 Web 应用开发.这些框架都提供了一些核心的特性,例如 DOM 操作,动画,事件处理以及 Ajax 交互,但不是都带有 UI 组件.今天这篇 ...

  6. JS&OpenCurlyDoubleQuote;盒子模型”

    列举几个常用的属性 client系列 clientWidth - 盒子真实内容的宽度[content+padding左右],不包括边线和滚动条 clientHeight - 盒子真实内容的高度[con ...

  7. Windows Server 2012 R2 英文版安装中文语言包教程

    Windows Server 是云操作系统的主要组成部分. 有了 Windows Server,再加上云操作系统内的开发者技术,您就可以构建现代业务应用程序. 现代业务应用程序通常涵盖内部部署资源和公 ...

  8. 060 SparkStream 的wordcount示例

    1.SparkStream 入口:StreamingContext 抽象:DStream 2.SparkStreaming内部原理 当一个批次到达的时候,会产生一个rdd,这个rdd的数据就是这个批次 ...

  9. Python导入jar包

    一.环境准备 1.Python 3.6 64位+jre 64位+win64位(jre和Python位数一致) 2.安装jpype,安装的时候输入 pip install jpype1 2.1安装提示e ...

  10. 使用 Python 进行 socket 编程

    本文主要参考 https://docs.python.org/3/howto/sockets.html . 本文只讨论 STREAME(比如 TCP) INET(比如 IPv4) socket. 在多 ...