赞
踩
IDEA的Remote JVM Debug功能可以用来在IDEA中调试远程服务器中的代码。其原理是在两个JVM间通过debug进行socket通信,以达到远程调试的目的。
你有时候会不会遇到一下几个问题:
我本地明明运行的好好的,部署到远程服务器上就出问题了。
本地很难重现,线上的环境在本地很难搭建准备。
要是我能远程直接调试该多爽,好吧,让你爽的神器来了。
8年前,写过一篇《如何用Eclipse对生产环境的JAVA应用进行远程调试》
,目前我们已经把开发环境迁移到了IntelliJ IDEA,所以也得同步补上这一课。
启动脚本中添加
-agentlib:jdwp=transport=dt_socket,address=*:6688,server=y,suspend=n
完整的启动脚本如下:
echo Starting the system server
java -server -agentlib:jdwp=transport=dt_socket,address=*:6688,server=y,suspend=n -Dfile.encoding=UTF-8 -Dspring.profiles.active=local -Xms4096M -Xmx4096M -XX:+UseG1GC -XX:+FreeHeapPhysicalMemory -XX:-OmitStackTraceInFastThrow -Xlog:gc*:log/gc_$(date +"%Y%m%d%H%M").log:time,level,tags:filecount=50,filesize=100M -XX:+HeapDumpOnOutOfMemoryError -jar $PWD/game.jar &
参数说明
transport: 指定运行的被调试应用和调试者之间的通信协议,它由几个可选值: dt_socket:主要的方式,采用socket方式连接。 dt_shmem:采用共享内存方式连接,这个仅支持 Windows 平台。
server: 指定当前应用作为调试服务端还是客户端,默认为n。 如果你想将当前应用作为被调试应用,设置该值为 y,如果你想将当前应用作为客户端,作为调试的发起者,设置该值为n。
suspend: 当前应用启动后,是否阻塞应用直到被连接,默认值为 y。 在大部分的应用场景,这个值为 n,即不需要应用阻塞等待连接。一个可能为 y的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。
address: 暴露的调试连接端口,默认值为 8000。 此端口一定不能与项目端口重复,且必须是服务器开放的端口。
onthrow: 当程序抛出设定异常时,中断调试。
onuncaught: 当程序抛出未捕获异常时,是否中断调试,默认值为 n。
launch: 当调试中断时,执行的程序。
timeout: 该参数限定为java -agentlib:jdwp=…可用,单位为毫秒ms。 当 suspend = y 时,该值表示等待连接的超时;当 suspend = n 时,该值表示连接后的使用超时。
这里特别要注意的是,address不能只填个端口,这样的话,只能本机访问,必须填成*:6666 这个形式
在IDEA中点击Run/Debug Configurations,然后点击"+"号添加一个Remote JVM Debug,并填写远程服务器的IP地址和端口号,其中的参数为IDEA默认添加进去的,不用修改。通过debug模式运行此Remote Debug就能连接到远程服务器,在本地代码中打上断点,就能拦截请求至本地,进行debug调试。
点击debug,控制台会显示:
Connected to the target VM, address: '***.***.**.***:****', transport: 'socket'
表示已经连上,就可以远程断点调试啦,就像本地调试一样的感觉。
停止运行的话,就会显示
Disconnected from the target VM, address: '***.***.**.***:****', transport: 'socket'
需要注意的是,远程调试前需拉取最新代码,保证服务器与本地代码同步;远程调试只能同时满足一个人连接,也就是说在远程服务器debug的时候,别人就没法正常使用该环境。这个功能虽好,但别在正式环境,做断点调试哦,会阻碍正常的业务,甚至宕机的,切记!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。