远程调试就是用本地的代码调试服务器上的代码,稍微想一想怎么能作到呢,确定是本地和远程服务上的虚拟机之间实现了相互通信啊.。术语话一点,就是本地和远程的JVM之间基于某种协议(debug协议)以套接字(socket) 的方式实现通讯,从而实如今本地远程调试服务端代码的功能。既然是以套接字的方式,那可定就有服务端和客户端的概念。这里不要思惟定势了,所谓服务端和客户端是相对的,并非说你部署服务的远程端才叫服务端,实际上,只要你喜欢,你能够将本地IDE配置成服务端,让远程服务启动后来主动链接本地,固然,一般的方式仍是顺势思惟,就把远程配置为socket的服务端,监听客户端;并且链接的创建都是服务端先启动后监听特定端口,等待客户端链接。java
在运行java -jar命令来启动的项目如内嵌服务器(如Jetty)或者只是简单的运行 main 方法的场景下,想要远程调试,也很简单,就是在启动时添加远程调试相应的参数,下面为博主测试jar包环境下配置参数,彻底能够拿去即用的—— 浏览器
java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=9999,suspend=n -jar debug.jar
参数释疑:服务器
-XDebug 启用调试模式;
-Xrunjdwp 加载JDWP的JPDA参考执行实例;
transport 用于在调试程序和 JVM 使用的进程之间通信;
dt_socket 以套接字方式传输;
server=y/n 是否支持在server模式的虚拟机中(java -version能够查看到虚拟机默认运行模式,但布衣博主发现没有此参数也不影响调试,此条存疑);
address=9999 调试服务端监听的端口号,若是是做为调试客户端,须要加上IP地址,形如: java -Xdebug -Xrunjdwp:transport=dt_socket,address=192.168.1.100:9999,suspend=n -jar debug.jar
suspend=y/n 是否在调试客户端创建链接以后启动 JVM,设置为y程序启动会阻塞,直到客户端创建链接程序才会正式启动,为 n 程序直接启动eclipse
本地 Idea配置和服务启动以下图:socket
本地和远程服务创建调试链接后,若是代码中打有断点,在本地浏览器中访问服务器地址,就能够愉快的在本地查看服务器端代码的运行状况了——测试
注意:调试过程必定保证本地代码和服务代码的一致性,不然本地看到的运行轨迹会让你莫名其妙。spa
附:eclipse中经过 run -> Debug Configurations -> Remote Java Application一样的配置便可。debug
这里还要说更经常使用以Tomcat做为服务器运行项目的情景,有些教程说要在启动脚本如startup.sh或catalina.sh 中配置调试参数等等,其实不用的,真的不用的,由于咱们的 Tom 猫已经把调试参数配置好了的,在它的启动脚本catalina.sh(startup.sh最终也是调用该启动脚本)中你能够看到以下脚本代码: 3d
因此,开启远程调试就很简单了,直接 运行 ./catalina.sh jpda start 启动,默认监听 8000 端口便可开启远程,你能够经过 lsof -i:8000 或 netstat -lnp | grep 8000 等查看端口占用状况,也能够在Tomcat的启动日志中查看监听的端口。调试
启动后,IDE端的配置就和博文上面演示的是同样的了,本身愉快的玩耍吧。