为什么需要远程debug
相信很多人在开发中遇到过这样的问题, 就是明明代码在自己的环境上是好的, 为什么去了测试环境就有问题, 这个时候你可能会质疑测试, 是不是准备的数据有问题?还是不会使用, 导致用错了场景? 还是部署有问题?
在做数据项目的时候, 遇到bug可能会把相应的数据下载到本地开发环境, 然后进行debug, 但如果遇到了如下的问题, 该怎么办呢
- 数据量特别大, 本地无法下载
- 数据比较敏感, 安全原因不让下载
- 本地无法搭建环境, 比如, 需要启动cluster, 需要至少三台物理节点
这个时候远程debug就要上场了, 这样你就能在本地看到远端运行的样子了, 而不用只看输出日志去推断可能哪里出了错误.
远程调试就是服务端程序运行在一台远程服务器上,我们在本地服务端的代码中设置断点(本地的代码必须与远端一致),进行调试。每当有请求到达远程服务器时能够在本地知道远端程序的运行情况。
增加remote
选择Edit Configurations
远程项目修改重启命令
nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10201 -jar openstack_learning-0.0.1-SNAPSHOT.jar > lys.log &
本地运行
远程项目会打印日志
Listening for transport dt_socket at address: 10201
执行debug一下,可以远程调试,并获取远程的环境信息
远程调试原理
Java远程调试的原理是两个VM之间通过debug协议进行通信,然后以达到远程调试的目的。两者之间可以通过socket进行通信。
调试器通过debug协议(JDWP, Java Debug Wire Protocol)与被调程序进行通信,实现远程调试。
DEBUG选项参数的意思
nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10201 -jar openstack_learning-0.0.1-SNAPSHOT.jar > lys.log &
jdwp是Java Debug Wire Protocol的缩写
server=y表示是监听其他debug client端的请求。
suspend表示是否在调试客户端建立连接之后启动 VM。如果为y,那么当前的VM就是suspend直到有debug
address=10201 表示端口是10201
未连接
客户端连接后
客户端断开
注意
- 请确保你在的security group允许相应的debug端口号暴露, 例如10201
- 因为远程debug连接一个host, 如果你的debug断点无法命中, 所以请确保你的cluster是否只有一个实例, 如果出现双主, 多实例的情况有可能导致断点无法命中
- 请确保你远端运行的代码是和你本地代码一致的, 否则可能会出现不可预知的行为, 因为远程debug是按照行号来映射的