1、点1处后点击2处,进入远程debug配置页面
2、在Remote下面添加配置文件,主要的参数如下:
详细参数解释:
3、点击Apply后,点击OK按钮
4、注意事项
a、请确保在所有这些示例中,远程调试端口(如5005)未被防火墙或任何网络策略阻塞,并且你的安全设置允许你从IDE连接到远程服务器上的这个端口。
b.确保调试端口不对外暴露,避免安全风险。
c.远程调试可能会影响应用程序性能,不宜在高峰时段进行。
d.必须确保拥有足够权限在远程服务器上启动调试模式。
e.需要稳定的网络连接以保证调试会话不会中断。
5、IDEA 远程调试的细节
细节1:停在本地断点,关闭程序后会继续执行吗
如果远程调试在自己的断点处停下来了,此时关闭IDEA中的项目停止运行,则还会继续运行执行完剩下的逻辑吗?会的,这点比较不容易记住
以下面的代码为例,在第一行停住了。然后IDEA中停掉,发现停掉之后控制台还是打印了剩下的日志。
细节2:jar包代码和本地不一致会怎么样?
IDEA 里的代码如果不和jar包的一致,会怎么样。
结论:要保证和远程启动的代码一致。
否则你debug的时候的行数会对不上。报错抛异常倒是不会。像这种还是能对得上行数的
比如你调试test1方法,test2方法在test1下面,在test2里加代码,这样并不影响test1中的行号,这种是可以在调试的时候准确反应行号的
细节3:日志打印在哪里?
日志不会打印在IDEA的控制台上。即System.out
以及 log.info
还是打印在远程的。
@GetMapping("/test1")
public String test1() {
System.out.println("第一行");
System.out.println("第二行");
log.info("log 第一行");
log.info("log 第二行");
return"ok";
}
细节4:调试时其他人会不会卡住?
远程调试的时候,打了断点,停住后会不会导致页面的请求卡住。
比如你使用远程调试,别的QA在测试这个页面,结果他们看到的结果是怎么样的?会卡住吗?会的,已经实际遇到过这种情况了。
细节5:本地代码修复bug远程调用的时候
如果在远程调试过程自己发现了bug,本地改好后重新启动IDEA里的项目,再到页面调用一次,能修复吗?不能,运行的还是远程部署的jar中的代码
这个直接击碎了远程页面点一点触发本地代码进行debug的梦想。如果可以的话那调试代码就方便太多。
细节6:这个不算远程调试的问题,是dropframe的问题,放在这里一起讲了
关于drop frame
的问题,如果drop frame
了重新进行调试,会不会插入2条记录?
如图 userMapper.insert(eo)
,本方法没有使用 @Transactional
修饰,mapper方法执行过后事务会被立即提交,则库表里多了一行记录,如果drop frame
后,再次进行调试,再次执行这代码,于是又插入了一条记录。
如果加上 @Transational
就不会有两条记录了,dropframe的时候事务没被提交,再次执行该插入代码也不会插入2条。
关于什么是drop frame
细节7:跟上面一样,是dropframe问题
如果把上述插入数据库的逻辑,换成调用远程的接口,在dropframe后,再次执行相同的代码,会不会导致远程接口被执行了2次?会的。
总结
好像感觉远程调试的用处也不是那么大,不能作为长期使用的调试工具。只能作为临时调试的手段。
难点有几个:
-
难保证本地代码和远程一致,而且你也很难判断是否一致
-
通过远程调试发现了bug,但是又不能立即修复后继续调试,只能修复后部署后继续远程调试
参考文章链接: