在我们开发过程中经常会遇到在生产或者测试环境中出现了Bug,但是在本机总是无法重现的问题。在这种情况下,如果进行远程调试的话可以比较方便的定位问题。要Java中启用远程调试,必须在生产或者测试环境的服务器的启动命令中增加一些参数,各个服务器需要修改的文件分别为:
- Tomcat:startup.sh/cmd
- WebLogic:startWebLogic.sh/cmd
- WebSphere:进入控制台,应用程序服务器 > server1 - Java 和进程管理 - 进程定义 - Java 虚拟机 ,启动 “调试方式”,必须重启server1
- JBoss:run.sh/cmd
在这些文件中(WebSphere例外)的找到Java参数设置的参数名称,通常为JAVA_OPTS、JAVA_OPTIONS等,添加以下设置:
- Windows:SET JAVA_OPTS=%JAVA_OPTS% -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=4000 -Xdebug -Xnoagent
- Unix:JAVA_OPTS=${JAVA_OPTS} -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=4000 -Xdebug -Xnoagent
其中4000为端口号,可以随意指定一个(WebSphere默认为7777)。在启动服务器后,运行netstat -an|find "4000"或者netstat -an|grep 4000,应该可以看到服务器上有这个端口处于LISTENING状态。回到客户端中,Eclipse窗口中点击菜单Run - Open Debug Dialog,在Remote Java Application中点击左上角的New launch configuration,然后在右边的Host和Port中填写服务器的IP和上面指定的端口号,在Source这个Tab中把所有项目增加到Source Look Path中。然后就可以点击Debug连接到远程的服务器进行调试
在远程调试时,请注意:
- 注意本地代码必须与服务器统一,否则断点、运行代码的行号会错乱,对调试有影响
- 连接成功后,本地Eclipse中的Console小窗口不会有任何显示的,所以要切换到Debug Perspective看看是不是已经连接成功了
- 代码中调用的System.out.println打印的还是在服务器的控制台窗口或者日志中,本地Eciplse不会有显示
- 一个Java进程只允许一个调试连接的,必须断开上一个连接才可以再连接,因此若发现Eclipse提示连接不上时,需要切换到Debug Perspective确认是否已经存在一个连接
- 在调试过程中可以在Eclipse中直接修改代码并保存,若Eclipse没有弹出警告对话框则表示成功的要求远程JVM进行了Hot Code Replace,这样可以方便的进行调试或修正Bug测试。但是要注意这些修改会在重启服务器后失效,需要重新修改并保存文件使得Eclipse再次通知远程JVM进行Hot Code Replace
- linux环境下的tomcat可能在catalina.sh