1. 简单理解
远程调试就是用本地的代码调试服务器上的代码, 稍微想想怎么能做到呢, 肯定是本地和远程服务上的虚拟机之间实现了相互通讯啊.. 术语话一点, 就是本地和远程的 JVM 之间基于某种协议 (debug 协议) 以套接字(socket) 的方式实现通信, 从而实现在本地远程调试服务端代码的功能. 既然是以套接字的方式, 那可定就有服务端和客户端的概念. 这里不要思维定势了, 所谓服务端和客户端是相对的, 并不是说你部署服务的远程端才叫服务端, 实际上, 只要你喜欢, 你可以将本地 IDE 配置成服务端, 让远程服务启动后来主动连接本地, 当然, 通常的方式还是顺势思维, 就把远程配置为 socket 的服务端, 监听客户端; 而且连接的建立都是服务端先启动后监听特定端口, 等待客户端连接.
3. 命令环境
在运行 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 程序直接启动
本地 Idea 配置和服务启动如下图:
本地和远程服务建立调试连接后, 如果代码中打有断点, 在本地浏览器中访问服务器地址, 就可以愉快的在本地查看服务器端代码的运行情况了 --
注意: 调试过程一定保证本地代码和服务代码的一致性, 否则本地看到的运行轨迹会让你莫名其妙.
附: eclipse 中通过 run -> Debug Configurations -> Remote Java Application 同样的配置即可.
3. 容器环境
这里还要说更常用以 Tomcat 作为服务器运行项目的情景, 有些教程说要在启动脚本如 startup.sh 或 catalina.sh 中配置调试参数等等, 其实不用的, 真的不用的, 因为我们的 Tom 猫已经把调试参数配置好了的, 在它的启动脚本 catalina.sh(startup.sh 最终也是调用该启动脚本)中你可以看到如下脚本代码:
所以, 开启远程调试就很简单了, 直接 运行 ./catalina.sh jpda start 启动, 默认监听 8000 端口即可开启远程, 你可以通过 lsof -i:8000 或 netstat -lnp | grep 8000 等查看端口占用情况, 也可以在 Tomcat 的启动日志中查看监听的端口.
启动后, IDE 端的配置就和博文上面演示的是一样的了, 自己愉快的玩耍吧.
来源: https://www.cnblogs.com/chenbenbuyi/p/10591430.html