个人思考
技术有时候不是那么重要。
重要的是,这个技术可以解决什么问题?
解决用户什么痛点?
比如远程 debug 也许实现起来简单,但是开发每次测试环境查询问题很麻烦,发现没打印日志。
修改代码+编译发布+验证,可能要20分钟。
那么远程 debug 就可以解决这个问题。
类似的,也可以是阿里的 Arthas-01-java 线上问题定位处理的终极利器
java 远程 debug
一、什么是远程 Debug?
远程 Debug(Remote Debugging)是指: 你在 本地 IDE(如 IntelliJ IDEA、Eclipse、VS Code) 上调试运行在 远程服务器(例如 Linux 上的 Tomcat、Java 服务、Docker 容器)中的 Java 应用。
调试时,你可以:
- 设置断点
- 单步执行(Step Over / Step Into)
- 查看变量值、调用栈
- 动态修改变量值(IDE 支持时)
它就像在本地调试一样,但目标程序跑在远程。
二、原理
远程调试依赖 Java Debug Wire Protocol (JDWP)。
流程是:
- JVM 启动时加载调试代理(agent),监听一个端口。
- IDE 作为调试客户端,连接到这个端口。
- 通过 JDWP 协议,IDE 和 JVM 交换调试信息(断点、变量、堆栈)。
常见 JVM 选项:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
解释:
agentlib:jdwp
→ 启动 JDWP 调试代理transport=dt_socket
→ 用 socket 作为传输方式server=y
→ JVM 作为调试服务器,等待 IDE 连接suspend=n
→ 是否挂起等待调试器(n 表示直接运行,y 表示等调试器连上才运行)address=*:5005
→ 调试端口,远程 IP 也能访问
三、启动方式
1. 命令行启动
如果你是自己运行 Java 程序,可以这样:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar myapp.jar
然后本地 IDE 配置连接 远程IP:5005
。
2. Tomcat 等应用服务器
修改 catalina.sh
(Linux)或 catalina.bat
(Windows),在 JAVA_OPTS
中加入:
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
重启 Tomcat 后,远程调试端口就开启了。
3. Docker 容器
如果服务跑在 Docker 里,需要:
- 在 Dockerfile 或启动参数里加 JVM 调试参数。
-
映射调试端口,例如:
docker run -p 8080:8080 -p 5005:5005 myapp
- 本地 IDE 连接
宿主机IP:5005
。
四、IDE 配置
IntelliJ IDEA
- 打开
Run → Edit Configurations
- 新建
Remote JVM Debug
配置 -
填写:
- Host: 远程服务器 IP
- Port: 5005
- 点击调试按钮(绿色小虫),就能连上远程 JVM。
Eclipse
Run → Debug Configurations
- 选择
Remote Java Application
- 填入 Host + Port
- Apply & Debug。
五、实战场景
场景 1:线上问题排查
- 临时在测试或预发布环境启用远程调试
- 用 IDE 连上去,直接在代码里断点调试
⚠️ 注意:不要在生产环境随便开远程调试,有安全风险(未授权的人也能连上),还可能阻塞业务线程。
场景 2:本地-远程联调
例如:
- 服务端在测试机
- 前端在本地调试
- 遇到后端逻辑问题,可以直接远程打断点跟踪。
六、安全问题
远程调试本质上是 JVM 暴露了一个 调试端口,如果不加限制:
- 任何人都能连上你的 JVM
- 甚至能执行代码(高危)
解决方法:
- 不要在公网直接暴露
5005
端口 -
配合 SSH 隧道 来转发:
ssh -L 5005:localhost:5005 user@remote-server
然后 IDE 只需连
localhost:5005
。 - 或者用内网 VPN。