标签:
这部分主要讲,如何开启tomcat远程调试,并佐以实例。本文方式适用于windows和linux。
假设有两台机器,A是tomcat服务器所在机器,B是IDE安装机器。A和B可以是同一台机器,通常A是测试环境,B是开发环境。
在A机器的tomcat/bin/文件夹中,新建文件setenv.bat(或者startup.sh,根据你的操作系统),输入:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
保存文件。启动startup.bat(或者startup.sh)。
在B机器上,启动IDE Intellij Idea。
在run中打开edit configurations
点击左边绿色的加号,选择remote
输入IP地址和端口。
在程序中设置断点,刷新web页面,即可触发断点进行调试。[end]
在测试环境启用Tomcat Remote Debug模式
Tomcat启动远程调试非常简单,只需要在JVM启动参数中设置下变量即可。
上面所做的事情,也就是在设置下JVM的启动参数。
根据Intellij Idea的提示:
对于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参数,stackoverflow上是这么解释的:
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 ‘8000‘
来查看该端口是否开启
suspend:如果是y,则需要等B机器上的debugger开启后,程序才会开始运行。否则,程序启动时候不会挂起,直接运行。
-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.
设置参数有多种方式,其本质是修改catalina中的JAVA_OPTS值,也就是JVM的启动参数。
一种方式是,直接在catalina中设置该值。不过这种方法,hardcode了catalina文件,属于not recommend方式。
推荐的方式是,在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/
关键摘抄如下:
标签:
原文地址:http://www.cnblogs.com/XuYankang/p/jpda.html