作为一名自信的程序员,经常会遇到本地跑测试没有任何问题,可是一上测试环境就出BUG的情况,这个时候脑袋里冒出的第一个想法就是 “我的代码没问题,一定是环境问题”,那接下来第一件事,我们就是要自证清白。
比较常见也是比较容易想到的办法就是加log,每个方法的开始结束,每个判断的前后加log,打印出此时此刻的参数,然后编译、打包、部署、跑一遍流程、拿出日志、分析一遍,有可能就找到BUG了,但是有一种情况,这种方法没法发现问题,比如说在团队开发的情况下,某一处的代码被覆盖了,日志是正常打印了,但是代码执行的逻辑不一样。
我在团队里比较推荐使用 IntelliJ IDEA + JAVA远程调试(Remote Debugging)
接下来我介绍下这种方法
应用配置
应用启动需要添加 JVM参数
JAVA 5.0以后版本使用
-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n
JAVA 5.0 以前版本使用
-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend =n
参数说明
- transport=dt_socket 表示应用端与调试发起端使用socket通信协议
- address=5005 表示调试的通讯端口(一个未被使用的端口,当suspend=y时可配置调试者IP:端口)
- server=y 表示这个 JVM 即将被调试
- suspend=n 表示应用不需要等待调试者加入可以立即启动,如果是y,则应用会等待5005端口被调试者访问才会完全启动(可根据调试需要自由变换)
IDEA配置
Run -> Edit Configurations -> Add New Configuration -> Remote JVM Debug
参数说明
-
Debugger Mode
Attach to remote JVM 服务端启动一个端口供客户端去连接调试
Listen to remote JVM 服务端启动一个端口并监听等待客户端接入(服务端 suspend 设置y时候适用) -
Host - 服务端IP
-
Port - 服务端address设置的端口
-
Command line arguments for remote JVM - 给出在不同Debugger Mode下建议的JVM启动参数
-
Use Module classpath - 需要调试的具体项目模块,不是必选
以上,就完成了所有配置,这时候就可以在本地打断点调试服务器上的应用了,选择新的配置启动即可
Tips
- 远程调试建议使用 线程断点+ 条件 的形式,因为测试环境毕竟是公用的,这样可以避其他请求被阻塞,我之前就因为使用普通断点导致存活校验被阻塞,服务反复重启。
- 调试过程中如果发现断点执行的代码没有在预期的行数,那就是服务器上代码和本地的不一致导致的
- 本地修改代码是不会同步修改服务器代码的