IDEA 进行远程 Debug,这个太强了。。

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.cn/post/
6844904071204339725

0e6a42ad1fc549bec0b5b5ebe118c33c.png


正文

回到正题

说到远程Debug这个功能,基本上大多IDE都会自带,但是一般情况下还真是很少用,大概是因为...

6d90f8fbf9693a2b868619d6140cae0d.png

Just a joke😄,不要当真

笔者切换到IDEA之后,还真再就没用过远程Debug,直到昨天发现了一个非常基础的错误...

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

坑从何来

坑来自于我的开源小工具:

https://gitee.com/vtDev/v-mock

笔者本意是打造一个,简单,轻巧,一键运行的接口模拟系统 ,用来方便等待他人接口 的前端后端同学。

基于以上目的,我使用了嵌入式数据库sqlite ,来配合Springboot,构造了无须配置,一行启动的小jar包. 目录结构如下,数据库直接扔在了Resource中:

8f33216c82d0bd2540ef995d951f1a08.png

开源后有使用的同学提了Bug,笔者也是正常操作,改完bug重新打版发行.

升级版本的同学,发现数据没了,笔者暂时给出了方案,*嵌入式数据库嘛,把旧jar中的DB文件,覆盖到新Jar中就好了 *

24c055ab0bfdf279f19d73ae42b40c35.png

(DB文件位于jar包中的位置)

说出这句话的时候,也不能完全赖🧠瓦特了,毕竟Springboot+Sqlite这种奇葩组合也是为了工具的小巧性,偶尔尝试的产物.

Spring Boot 基础就不介绍了,推荐下这个实战教程:https://github.com/javastacks/spring-boot-best-practice

事实上稍微想想,db文件和其他资源不一样,是要频繁改写的,当然改动的不是jar包中的原始文件.

直到收到了一个Issues,告诉了笔者DB文件复制到新jar中并没有生效.

笔者也迅速反应过来,怎么可能用的jar内的DB文件,真实文件不出意外是放在java.io.tmpdir下了.

java.io.tmpdir的路径,一般情况下,macos是在$TMPDIR,win则在%temp%.

笔者也切换到了对应的目录,终于看到了jar运行时真实使用的DB文件:

2707f9a95294d828eeb965bbdeb7e455.png

但是这个命名方式很奇怪啊,和原本的v-mock.sqlite并不沾边.

一路追随sqlite的jdbc驱动源码,找到了org.sqlite.SQLiteConnectionextractResource方法,看到了命名代码:

2f57327ba72c9711d86845a47b991ded.png

其实看到这已经清晰了,源码中使用了sqlite-jdbc-tmp 拼接了原始jar中DB文件的URL类的hashcode作为文件名.

之所以笔者开发的时候没注意到 ,看看这个方法第一个if 判断就知道了。

笔者习惯用IDE中的Springboot或者Application模式直接启动项目,并不是打包后的启动方式

所以当Protocolfile而不是jar的情况,直接就使用了target/classes/db/v-mock.sqlite文件,不用生成临时文件.

开发时,DB可视化工具也连接的是target/classes/db/v-mock.sqlite,所以当时并没发现疑点.

事实上这是很正常的操作,很多地方的源码都有判断是普通web环境 还是以jar 运行的,如果有这方面的调试,要思考你的启动方式了.

那么想把断点打在第一个if之后 ,看到效果,选择之一 就是可以使用远程Debug 的方式。

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

IDEA的远程Debug

IDEA的远程Debug模块真的是设计十分贴心,傻瓜操作,命令都生成好了,不知道现在的eclipse版本有没有这么贴心.

0bd0f960e8d5f8de82d6736a79f54fd3.png

从configuration中搜索remote 模版,点击右上角的create configuration ,就创建好了一个远程debug 启动方式.

Debugger mode 选择Attach to remote JVM 即可,它还有一个选项是Listen to remote JVM ,意如其名嘛,一个是主动附着到启动的程序,一个是被动监听程序。

ip和端口 不用多说,笔者直接用的本地jar包,所以填了localhost ,右边jdk版本如果使用其他版本的,需要调一下。

中间的文本框就是生成好的jvm参数了,非常人性化了,直接加入启动命令即可java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar

可以完全不用管命令什么意思,如果你想知道,笔者也大概解释一下:

  • -agentlib:jdwp 最重要的参数,启动JDWP代理,JDWP全称就是Java Debug Wire Protocol,官方给的方便调试的工具.

  • transport=dt_socket 通过socket方式传输数据,dt八成就是data transfer的缩写了.

  • server=y 开启调试server端,注意,因为笔者上文选择的是Attach to remote JVM,所以这里才是y ,等待有调试器Attach过来,如果你选了Listen模式,那么就是反过来的,调试器是server,这里就是n 了.

  • suspend=n 是否挂起,这里设置为n ,也就是说程序正常跑,什么时候需要Attach就去Attach即可,如果设置为y ,程序将会等待调试器Attach上才会继续执行,比如启动源码的调试场景.

  • address=5005 调试端口设置为5005,当然其它端口也可以.

f33a5d9e8a41e23e6d17a34adf70479b.png

启动jar包,再以刚才创建的方式进行debug,期待的断点位置已经成功到达了。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

d87422e6d9fbb0428fc8bc9275397cee.png

已在知识星球更新源码解析如下:

ece2694bea9fe3170fe3bf96225acbcd.png

a8b29376ac3cd8d573d2d854d2457f4d.png

bd119f4892817e0da81a16522ca8c21a.png

0ba8ee1072df73d70d9f0f5d9310be51.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值