在实际J2EE开发中,很多功能,我们在本地开发的时候调试成功,等到部署到平台,做线上测试的时候,经常出现一些不可预知的问题,比如在实际开发中,最近就碰到了用Java执行shell脚本,但是shell脚本执行过程中,可能由于shell脚本中存在sleep等语句,导致了shell脚本的执行时间非常长。同时由于在web应用中,对于超时控制很严格,这时候就会出现一些不可预知的问题,对于这些问题,我们平时开发的时候并不好测试,必须部署到线上才可以测试的功能,对于这些功能,我们可以利用remote debug技术来实现在线调试。
虽然可能我们的应用可能部署在不同的servelet容器上(tomcat, jetty),但是本质上都是运行在JVM之上。所以这里的远程调试本质上就是利用不同JVM之间通过socket通信,达到的远程调试的目的。调试的模型如下图所示tomcat调试原理图.jpg
这里以intelliJ14,本地和远程都是tomcat8为例简单介绍调试过程。在IntelliJ的配置服务器的地方,新建一个tomcat->remote,如图所说
tomcat远程调试intelliJStep1
tomcat远程调试intelliJStep2
tomcat远程调试intelliJStep3
这里我们配置好之后IntelliJ给我们生成一个句-agentlib:jdwp=transport=dt_socket,address=8000,suspend=n,server=y
解释一下这行配置的意思
jdwp=transport=dt_socket表示应用程序与调试器之间的通信协议是transport=dt_socket
address=8000表示应用程序的调试端口是8000
suspend=n表示服务器上的程序会不等待本地的debugger连接上来就先启动起来。但是如果设置成y的话,那么服务端的程序会等待本地的debugger连接上来才启动。这两者的区别在于设置成y可以比设置成n多获取一点启动的信息。对于有些远程程序启动不了的话,设置成y调试是比较好的。
server=y区分服务端JVM和本地JVM如果是服务端JVM就设置为y,如果是客户端JVM就设置成n
这个时候我们需要先关闭服务端程序,把配置参数写到服务端的启动脚本中。
编辑tomcat根目录下的bin/catalina.sh脚本,增加我们刚刚得到配置export CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,suspend=n,server=y"
catalina.shdebug配置
到这里服务端和本地端我们都配置好了.下面执行catalina.sh start这个时候得到
tomcat调试模式启动
这个时候要留意一下看看8000和8080端口起来没有,8000端口就是我们的调试端口,8080是服务端口,如果都启动的了,就可以进行调试了。
进入调试模式留意下本地的VM的连接信息
本地连接信息
这个时候先在本地打一个断点,随便访问一个远端接口,如下图,后面调试工就跟本地一样了。
tomcat远程调试信息
本文对于JPDA等并没有详细介绍如果有兴趣可以参考
http://kyfxbl.iteye.com/blog/1697203
http://devcat.spotty.com.cn/blog_trifork_com_2014_07_14_how_to_remotely_debug_applicatio.pdf