互聯(lián)網(wǎng)/程序員/技術/資料共享?
來自:juejin.cn/post/6844904071204339725
正文
說到遠程Debug這個功能,基本上大多IDE都會自帶,但是一般情況下還真是很少用,大概是因為...筆者切換到IDEA之后,還真再就沒用過遠程Debug,直到昨天發(fā)現(xiàn)了一個非常基礎的錯誤...推薦下自己做的 Spring Boot 的實戰(zhàn)項目:https://github.com/YunaiV/ruoyi-vue-pro
坑從何來
https://gitee.com/vtDev/v-mock
筆者本意是打造一個,簡單,輕巧,一鍵運行的接口模擬系統(tǒng) ,用來方便等待他人接口 的前端后端同學。基于以上目的,我使用了嵌入式數(shù)據(jù)庫sqlite ,來配合Springboot,構造了無須配置,一行啟動的小jar包. 目錄結構如下,數(shù)據(jù)庫直接扔在了Resource中:開源后有使用的同學提了Bug,筆者也是正常操作,改完bug重新打版發(fā)行.升級版本的同學,發(fā)現(xiàn)數(shù)據(jù)沒了,筆者暫時給出了方案,*嵌入式數(shù)據(jù)庫嘛,把舊jar中的DB文件,覆蓋到新Jar中就好了 *說出這句話的時候,也不能完全賴??瓦特了,畢竟Springboot+Sqlite這種奇葩組合也是為了工具的小巧性,偶爾嘗試的產(chǎn)物.Spring Boot 基礎就不介紹了,推薦下這個實戰(zhàn)教程:https://github.com/javastacks/spring-boot-best-practice事實上稍微想想,db文件和其他資源不一樣,是要頻繁改寫的,當然改動的不是jar包中的原始文件.直到收到了一個Issues,告訴了筆者DB文件復制到新jar中并沒有生效.筆者也迅速反應過來,怎么可能用的jar內(nèi)的DB文件,真實文件不出意外是放在java.io.tmpdir下了.java.io.tmpdir的路徑,一般情況下,macos是在$TMPDIR,win則在%temp%.筆者也切換到了對應的目錄,終于看到了jar運行時真實使用的DB文件:但是這個命名方式很奇怪啊,和原本的v-mock.sqlite并不沾邊.一路追隨sqlite的jdbc驅動源碼,找到了org.sqlite.SQLiteConnection的extractResource方法,看到了命名代碼:其實看到這已經(jīng)清晰了,源碼中使用了sqlite-jdbc-tmp 拼接了原始jar中DB文件的URL類的hashcode作為文件名.之所以筆者開發(fā)的時候沒注意到 ,看看這個方法第一個if 判斷就知道了。筆者習慣用IDE中的Springboot或者Application模式直接啟動項目,并不是打包后的啟動方式所以當Protocol是file而不是jar的情況,直接就使用了target/classes/db/v-mock.sqlite文件,不用生成臨時文件.開發(fā)時,DB可視化工具也連接的是target/classes/db/v-mock.sqlite,所以當時并沒發(fā)現(xiàn)疑點.事實上這是很正常的操作,很多地方的源碼都有判斷是普通web環(huán)境 還是以jar 運行的,如果有這方面的調(diào)試,要思考你的啟動方式了.那么想把斷點打在第一個if之后 ,看到效果,選擇之一 就是可以使用遠程Debug 的方式。推薦下自己做的 Spring Cloud 的實戰(zhàn)項目:https://github.com/YunaiV/onemall
IDEA的遠程Debug
IDEA的遠程Debug模塊真的是設計十分貼心,傻瓜操作,命令都生成好了,不知道現(xiàn)在的eclipse版本有沒有這么貼心.從configuration中搜索remote 模版,點擊右上角的create configuration ,就創(chuàng)建好了一個遠程debug 啟動方式.Debugger mode 選擇Attach to remote JVM 即可,它還有一個選項是Listen to remote JVM ,意如其名嘛,一個是主動附著到啟動的程序,一個是被動監(jiān)聽程序。ip和端口 不用多說,筆者直接用的本地jar包,所以填了localhost ,右邊jdk版本如果使用其他版本的,需要調(diào)一下。中間的文本框就是生成好的jvm參數(shù)了,非常人性化了,直接加入啟動命令即可java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar可以完全不用管命令什么意思,如果你想知道,筆者也大概解釋一下:- -agentlib:jdwp 最重要的參數(shù),啟動JDWP代理,JDWP全稱就是Java Debug Wire Protocol,官方給的方便調(diào)試的工具.
- transport=dt_socket 通過socket方式傳輸數(shù)據(jù),dt八成就是data transfer的縮寫了.
- server=y 開啟調(diào)試server端,注意,因為筆者上文選擇的是Attach to remote JVM,所以這里才是y ,等待有調(diào)試器Attach過來,如果你選了Listen模式,那么就是反過來的,調(diào)試器是server,這里就是n 了.
- suspend=n 是否掛起,這里設置為n ,也就是說程序正常跑,什么時候需要Attach就去Attach即可,如果設置為y ,程序將會等待調(diào)試器Attach上才會繼續(xù)執(zhí)行,比如啟動源碼的調(diào)試場景.
- address=5005 調(diào)試端口設置為5005,當然其它端口也可以.
啟動jar包,再以剛才創(chuàng)建的方式進行debug,期待的斷點位置已經(jīng)成功到達了。推薦閱讀:
2021 編程語言排行榜出爐!
JWT、JWE、JWS 、JWK 都是什么鬼?還傻傻分不清?
互聯(lián)網(wǎng)初中高級大廠面試題(9個G)內(nèi)容包含Java基礎、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務、Zookeeper、數(shù)據(jù)結構、限流熔斷降級......等技術棧!
?戳閱讀原文領取!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?