背景
分布式系统中日志是定位各种线上问题的重要手段,但是日志不能完全反映程序运行时的所有信息。下面介绍一种重量级的手段-远程调试,JVM远程调试通过JDWP协议。
JDWP是Java Debug Wire Protocol的缩写,它定义了调试器(debugger)和目标虚拟机(target vm)之间的通信协议。Target vm 中运行着我们要调试的 Java 程序,它与一般运行的JVM没有什么区别,只是在启动时加载了JDWP Agent从而具备了调试功能。而 debugger就是我们本地的调试器,它向运行中的target vm发送指令来获取target vm运行时的状态和控制远程Java程序的执行。Debugger和target vm 分别在各自的进程中运行,他们之间通过JDWP通信协议进行通信。
如何远程调试
接下来以一个RPC Server为例演示远程调试。
1.运行服务端:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=15555 -jar server.jar
参数解释:
server =y (表示以debug server运行)
suspend=y (y表示程序启动时会被阻塞,n表示不会)
address=15555 (debug server运行端口,debug client需要连接这个端口)
2.idea连接服务器debug端口
-
新建debug
-
在代码中添加断点
-
启动调试
这个时候就可以愉快的进行远程调试了。