要在预发布环境复现“本地能跑、上线就报空指针”问题,必须通过JDWP协议让IDEA远程调试Java进程:服务端需配置-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005参数并开放5005端口,客户端在IDEA中配置Remote JVM Debug指向服务器公网IP和对应端口,确保模块classpath正确后即可断点调试。

要在预发布环境复现“本地能跑、上线就报空指针”的诡异问题,必须让IntelliJ IDEA连接到远程服务器上正在运行的Java进程,实时查看变量状态、单步执行逻辑、验证第三方服务响应延迟对业务链路的影响。
服务端启用调试监听
在远程服务器上启动应用前,必须注入JDWP调试代理参数,否则IDEA永远连不上——这不是网络问题,而是JVM根本没开启调试通道。
方法一:直接启动命令追加参数(适用于临时验证)
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar your-app.jar
方法二:写入启动脚本(推荐用于稳定环境)
编辑 startup.sh 或 catalina.sh,在 JAVA_OPTS 或 CATALINA_OPTS 中追加:
export JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005"
【address=0.0.0.0:5005 不可省略端口前的 0.0.0.0,否则默认只监听 127.0.0.1,IDEA从外网连不上】
方法三:Docker容器内启用(需暴露端口+配置network)
docker run -p 5005:5005 --network host -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" your-image
开放调试端口并验证监听状态
第一步:用 firewall-cmd 或 ufw 放行端口
firewall-cmd --permanent --add-port=5005/tcp && firewall-cmd --reload
第二步:云服务器必须同步配置安全组规则,允许你的办公IP访问5005端口——漏掉这一步,所有本地连接都会超时。
第三步:确认JVM确实在监听
执行 netstat -tuln | grep :5005,看到 tcp6 0 0 *:5005 :::* LISTEN 才算成功;如果只显示 127.0.0.1:5005,说明 address 参数写成了 127.0.0.1:5005 或没写 0.0.0.0,必须重配。
IDEA客户端创建Remote JVM Debug配置
① 点击右上角菜单 Run → Edit Configurations → + → Remote JVM Debug
② 填写 Host:填服务器公网IP或域名(不要填 localhost 或 127.0.0.1)
Port:必须与服务端 address 参数中冒号后的数字完全一致,比如服务端是 address=*:5005,这里就填 5005
③ Debugger mode 选 Attach to remote JVM(这是99%场景的唯一选择)
Transport 保持 Socket 默认值即可
④ 【Module classpath 必须指向你本地项目的正确模块,否则断点命中但无法加载源码,变量全显示为
⑤ 点击 OK 保存配置
建立连接并开始调试
确保远程应用已用调试参数启动且 netstat 验证监听正常后,回到 IDEA。
在代码左侧灰色区域点击设置断点——必须是 Java 源码行,class 文件里点无效。
点击右上角绿色虫子图标(Debug),或按 Shift + F9,IDEA 就会尝试连接。
连接成功瞬间,底部 Debug 工具栏自动展开,Variables、Watches、Frames 面板实时刷新,线程堆栈可展开,鼠标悬停变量即显示当前值。


















