乐趣区

关于java:IDEA-进行远程-Debug这个太强了

起源:juejin.cn/post/6844904071204339725

注释

回到正题

说到近程 Debug 这个性能,基本上大多 IDE 都会自带,然而个别状况下还真是很少用,大略是因为 …

Just a joke😄,不要当真

笔者切换到 IDEA 之后,还真再就没用过近程 Debug,直到昨天发现了一个十分根底的谬误 …

坑从何来

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

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

笔者本意是打造一个,简略,笨重,一键运行的 接口模拟系统 ,用来不便 期待别人接口 的前端后端同学。

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

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

降级版本的同学,发现数据没了,笔者临时给出了计划,嵌入式数据库嘛,把旧 jar 中的 DB 文件,笼罩到新 Jar 中就好了

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

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

Spring Boot 根底就不介绍了,举荐下这个实战教程:
https://github.com/javastacks…

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

直到收到了一个 Issues,通知了笔者 DB 文件复制到新 jar 中并没有失效.

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

java.io.tmpdir 的门路,个别状况下,macos 是在 $TMPDIR,win 则在 %temp%.

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

然而这个命名形式很奇怪啊,和本来的 v -mock.sqlite 并不沾边.

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

其实看到这曾经清晰了,源码中应用了 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的形式。

IDEA 的近程 Debug

IDEA 的近程 Debug 模块真的是设计非常贴心,傻瓜操作,命令都生成好了,不晓得当初的 eclipse 版本有没有这么贴心.

从 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,当然其它端口也能够.

启动 jar 包,再以方才创立的形式进行 debug,期待的断点地位曾经胜利达到了。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版