南阳网站建设报价,品牌宝免费网站,合肥网站制作,万达做的电商网站有时候我们需要进行远程的debug#xff0c;本文研究如何进行远程debug#xff0c;以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。
配置
远程debug的服务#xff0c;以SpringBoot微服务为例。
首先#xff0c;启动SpringBoot需要加上特定的参数。
…有时候我们需要进行远程的debug本文研究如何进行远程debug以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。
配置
远程debug的服务以SpringBoot微服务为例。
首先启动SpringBoot需要加上特定的参数。
IDEA设置
高低版本的 IDEA 的设置可能界面有点不一样我用2020.1.1的。大致上差不多自行摸索。
IDEA打开远程启动的SpringBoot应用程序所对应的
1、选择 Edit Configuration 2、如图点击加号选择Remote 3、配置详细步骤见图 注意注意端口别被占用。后续这个端口是用来跟远程的java进程通信的。
可以注意到切换不同的jdk版本生成的脚本不一样
选择 jdk1.4则为
-Xdebug -Xrunjdwp:transportdt_socket,servery,suspendn,address50055这就是你为什么搜其他博客会有这种配置的原因其实这个配置也是可行的。但更准确应该按照下面jdk5-8的配置
选择 jdk 5-8则为
-agentlib:jdwptransportdt_socket,servery,suspendn,address50055选择 jdk9以上则为
-agentlib:jdwptransportdt_socket,servery,suspendn,address*:50055据说因为jdk9变得安全了远程调试只允许本地如果要远程则需要在端口前配置*
启动脚本改造
使用第一步得到的 Command line arguments for remote JVM 即可即-agentlib:jdwptransportdt_socket,servery,suspendn,address50055
改造后的启动脚本如下
nohup java
-agentlib:jdwptransportdt_socket,servery,suspendn,address50055
-jar remote-debug-0.0.1-SNAPSHOT.jar 注意在windows中用 ^ 来进行换行例如
java ^
-agentlib:jdwptransportdt_socket,servery,suspendn,address50055 ^
-jar remote-debug-0.0.1-SNAPSHOT.jar说明
端口可随意自己定未被占用的都行但是要和IDEA里的remote中设置的端口一致其他参数照抄。详细的参数解释可以参照附录或自己搜remote-debug-0.0.1-SNAPSHOT.jar 改成给你自己的 jar 包名字我给的脚本是后台运行的如不需要后台运行自行去掉 nohup 和 启动SpringBoot启动IDEA里的 细节
细节1停在本地断点关闭程序后会继续执行吗
如果远程调试在自己的断点处停下来了此时关闭IDEA中的项目停止运行则还会继续运行执行完剩下的逻辑吗会的这点比较不容易记住
以下面的代码为例在第一行停住了。然后IDEA中停掉发现停掉之后控制台还是打印了剩下的日志。
细节2jar包代码和本地不一致会怎么样
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但是又不能立即修复后继续调试只能修复后部署后继续远程调试