远程调试Web应用程序

有时候,我们不得不放弃在本地调试我们的程序,把我们的程序先布署到服务器,然后把调试信息都记在日志中,用眼睛瞅日志来调试程序。

不是用这种方式不行,只是效率太低,本来写程序是一件开心的事情,却变得令人心烦。

其实,Java本身支持远程调试,只要增加一些JVM的启动参数,就可以远程调试了,JVM启动参数就像下面的样子:

  -Xdebug -Xnoagent -Djava.compiler=NONE 
  -Xrunjdwp:transport=dt_socket,server=y,address=9988,suspend=n

下面是参数的说明:

-XDebug               启用调试。
-Xnoagent             禁用默认sun.tools.debug调试器。
-Djava.compiler=NONE  禁止 JIT 编译器的加载。
-Xrunjdwp             加载JDWP的JPDA参考执行实例。
transport             用于在调试程序和 VM 使用的进程之间通讯。
dt_socket             套接字传输。
dt_shmem              共享内存传输,仅限于 Windows。
server=y/n            VM 是否需要作为调试服务器执行。
address=9988          调试服务器的端口号,客户端用来连接服务器的端口号。
suspend=y/n           是否在调试客户端建立连接之后启动 VM 。

写出来的样子大概是这样的:

1 java  -Xdebug -Xnoagent -Djava.compiler=NONE 
2 -Xrunjdwp:transport=dt_socket,server=y,address=9988,suspend=n test.package.Main

配置远程服务器

如果我们想要调试一个Web应用程序,那么在启动Web服务器时需要增加上面的JVM参数。

由于最近我在使用Resin,所以就以Resin 4.0作为例子来说明一下(主要原因是网上说的都不管用)。

  • 环境:CentOS 6.3

  • 应用服务器:Resin4.0

  • JDK版本:JDK6

01 # 进入Resin的配置文件目录
02 # cd /usr/local/resin/conf
03 # ll
04 total 80
05 -rw-r--r-- 1 root root 12620 Oct 24 22:42 app-default.xml
06 -rw-r--r-- 1 root root 6447 Oct 24 22:42 cluster-default.xml
07 -rw-r--r-- 1 root root 21594 Oct 24 22:42 health.xml
08 drwxr-xr-x 2 root root 4096 Oct 24 22:42 keys
09 drwxr-xr-x 2 root root 4096 Oct 24 22:42 licenses
10 -rw-r--r-- 1 root root 5119 Oct 24 22:42 resin.properties
11 -rw-r--r-- 1 root root 12404 Mar 27 18:08 resin.xml

Resin启动时的JVM参数在resin.xml里面配置。

# vim resin.xml

01 <cluster id="app-youyuan">
02     <root-directory>.</root-directory>
03     <server-default>
04       <http address="*" port="8080" />
05         <jvm-arg>-Xms1024m</jvm-arg>
06         ... ... ...
07         <jvm-arg>-Xdebug</jvm-arg>
08         <jvm-arg>-Xrunjdwp:transport=dt_socket,address=9988,server=y,suspend=n</jvm-arg>
09     </server-default>
10   </cluster>

cluster -> server-default 结点里面设置JVM参数。

设置完成后重启resin:

1 /usr/local/resin/bin/resin.sh restart -server youyuan

启动完后,检查端口:

1  # netstat -apn | grep 9988
2 tcp 0 0 你机器的IP:9988 这里是IP:51840 ESTABLISHED 30130/java

可以看到,已经正常启动了。剩下的就是在本地连到服务器上进行调试了。

如果使用的是TOMCAT

在windows系统中:
打开%CATALINE_HOME%/bin下的文件catalina.bat,加入下面这行:
set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address= 8000
其中 address=8000是没被使用的端口号。连接方式有两种,为dt_shmem和dt_socket,分别表示本机调试和远程调试。
 
在非windows系统中:
打开% CATALINE_HOME %/bin/下的文件catalina.sh加入下面这行:
declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
输入命令startup.sh jpda start就可启动tomcat。

本地使用Eclipse连接服务器进行远程调试

  • Eclipse版本:4.3

1. 右击要调试项目,在弹出的菜单中点击 Debug AS -> Debug Configurations...

    如图所示,右击Remote Java Application,新建一项,

在Project中选中要远程调试的项目,在Connection Type中选择Socket Attach,在Connection Propertyies中设置远程调试的应用的IP地址及端口。

然后点击Apply,Debug就可以连接了。

如果遇到端口被占用,应用服务器启动不了,可以先查找端口

 命令: lsof -i:8001

然后杀掉相应进程即可

猜你喜欢

转载自haiziwoainixx.iteye.com/blog/2066432