目录
原理
本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息。
被调试程序的远程虚拟机:作为 Debug 服务端,监听 Debug 调试指令。jdwp是Java Debug Wire Protocol的缩写。
调试程序的本地虚拟机:IDEA 中配置的 Remote Server,指定 Debug 服务器的Host:Port,以供 Debug 客户端程序连接。
服务器端配置
Windows Server(startup.bat启动)
- 将Tomcat中的bin目录下的startup.bat启动脚本复制一份到本目录下并且修改名字为startup-debug.bat,然后打开startup-debug.bat文件
再startup-debug.bat文件的最下面找到
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
这句话,将这句话修改为
set JPDA_TRANSPORT=dt_socket
set JPDA_ADDRESS=9000
set JPDA_SUSPEND=n
call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%
catilina.bat中第一行添加
备注:修改startup.bat后可以忽略这一步,catilina.bat和startup.bat任意修改一个就行
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9000"
#这样应也可以(没有测试)
- 双击运行startup-debug.bat,我们就可以看到tomcat已经在9000端口进行监听。
Windows Server(Tomcat服务启动)
- 双击运行Tomcatxw.exe,java→Java Options添加
-Xdebug
-Xrunjdwp:transport=dt_socket,address=9000,server=y,suspend=n
- 启动Tomcat服务
Linux服务器
catilina.sh中第一行添加
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9000"
配置完成后重启Tomcat(shutdown.sh/startup.sh)
调试端配置
Eclipse远程debug
- 选中项目右键Dbug As→Dbug Confugurations…
- 选择Remote Java Application→Browse选择需要调试的项目设置参数开始调试
Intellij IDEA远程debug
添加启动项的位置Add Configuration选择Remote填好服务器IP和配置的调试端口开始调试
这里解释一下各种参数:
Debugger mode:debugger的模式,有两种:attach和listen。
- attach的意思是debugger连接到被debug的Java进程,是主动式的。
- listen的意思是debugger监听由Java进程发送过来的通信,是被动式的。
开始调试
- 要求:双方代码一致,否则远程调试无法启动;
- 本地启动刚刚配置的 Remote Server,正常时会看到日志: Connected tothe target VM, address: ‘xxx:5005’, transport: ‘socket’
- 本地 IDEA代码中设置断点
- 浏览器或手机 HTTP 访问服务器 IDEA 即可在断点暂停并跟踪
关闭调试
服务器上多开放个端口是不安全的,调试完毕后可恢复防火墙设置。
而 Java 服务器开启 Debug 服务器的功能可以保留,以便之后再次调试。