1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        IDEA 進(jìn)行遠(yuǎn)程 Debug,這個(gè)太強(qiáng)了。。

        共 2728字,需瀏覽 6分鐘

         ·

        2022-01-14 08:59

        程序員的成長(zhǎng)之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
        關(guān)注


        閱讀本文大概需要 3.5 分鐘。

        來(lái)自:juejin.cn/post/6844904071204339725

        正文

        回到正題
        說(shuō)到遠(yuǎn)程Debug這個(gè)功能,基本上大多IDE都會(huì)自帶,但是一般情況下還真是很少用,大概是因?yàn)?..
        Just a joke??,不要當(dāng)真
        筆者切換到IDEA之后,還真再就沒(méi)用過(guò)遠(yuǎn)程Debug,直到昨天發(fā)現(xiàn)了一個(gè)非?;A(chǔ)的錯(cuò)誤...
        推薦下自己做的 Spring Boot 的實(shí)戰(zhàn)項(xiàng)目:
        https://github.com/YunaiV/ruoyi-vue-pro

        坑從何來(lái)

        坑來(lái)自于我的開源小工具:
        https://gitee.com/vtDev/v-mock
        筆者本意是打造一個(gè),簡(jiǎn)單,輕巧,一鍵運(yùn)行的接口模擬系統(tǒng) ,用來(lái)方便等待他人接口 的前端后端同學(xué)。
        基于以上目的,我使用了嵌入式數(shù)據(jù)庫(kù)sqlite ,來(lái)配合Springboot,構(gòu)造了無(wú)須配置,一行啟動(dòng)的小jar包. 目錄結(jié)構(gòu)如下,數(shù)據(jù)庫(kù)直接扔在了Resource中:
        開源后有使用的同學(xué)提了Bug,筆者也是正常操作,改完bug重新打版發(fā)行.
        升級(jí)版本的同學(xué),發(fā)現(xiàn)數(shù)據(jù)沒(méi)了,筆者暫時(shí)給出了方案,*嵌入式數(shù)據(jù)庫(kù)嘛,把舊jar中的DB文件,覆蓋到新Jar中就好了 *
        (DB文件位于jar包中的位置)
        說(shuō)出這句話的時(shí)候,也不能完全賴??瓦特了,畢竟Springboot+Sqlite這種奇葩組合也是為了工具的小巧性,偶爾嘗試的產(chǎn)物.
        Spring Boot 基礎(chǔ)就不介紹了,推薦下這個(gè)實(shí)戰(zhàn)教程:https://github.com/javastacks/spring-boot-best-practice
        事實(shí)上稍微想想,db文件和其他資源不一樣,是要頻繁改寫的,當(dāng)然改動(dòng)的不是jar包中的原始文件.
        直到收到了一個(gè)Issues,告訴了筆者DB文件復(fù)制到新jar中并沒(méi)有生效.
        筆者也迅速反應(yīng)過(guò)來(lái),怎么可能用的jar內(nèi)的DB文件,真實(shí)文件不出意外是放在java.io.tmpdir下了.
        java.io.tmpdir的路徑,一般情況下,macos是在$TMPDIR,win則在%temp%.
        筆者也切換到了對(duì)應(yīng)的目錄,終于看到了jar運(yùn)行時(shí)真實(shí)使用的DB文件:
        但是這個(gè)命名方式很奇怪啊,和原本的v-mock.sqlite并不沾邊.
        一路追隨sqlite的jdbc驅(qū)動(dòng)源碼,找到了org.sqlite.SQLiteConnectionextractResource方法,看到了命名代碼:
        其實(shí)看到這已經(jīng)清晰了,源碼中使用了sqlite-jdbc-tmp 拼接了原始jar中DB文件的URL類的hashcode作為文件名.
        之所以筆者開發(fā)的時(shí)候沒(méi)注意到 ,看看這個(gè)方法第一個(gè)if 判斷就知道了。
        筆者習(xí)慣用IDE中的Springboot或者Application模式直接啟動(dòng)項(xiàng)目,并不是打包后的啟動(dòng)方式
        所以當(dāng)Protocolfile而不是jar的情況,直接就使用了target/classes/db/v-mock.sqlite文件,不用生成臨時(shí)文件.
        開發(fā)時(shí),DB可視化工具也連接的是target/classes/db/v-mock.sqlite,所以當(dāng)時(shí)并沒(méi)發(fā)現(xiàn)疑點(diǎn).
        事實(shí)上這是很正常的操作,很多地方的源碼都有判斷是普通web環(huán)境 還是以jar 運(yùn)行的,如果有這方面的調(diào)試,要思考你的啟動(dòng)方式了.
        那么想把斷點(diǎn)打在第一個(gè)if之后 ,看到效果,選擇之一 就是可以使用遠(yuǎn)程Debug 的方式。
        推薦下自己做的 Spring Cloud 的實(shí)戰(zhàn)項(xiàng)目:
        https://github.com/YunaiV/onemall

        IDEA的遠(yuǎn)程Debug

        IDEA的遠(yuǎn)程Debug模塊真的是設(shè)計(jì)十分貼心,傻瓜操作,命令都生成好了,不知道現(xiàn)在的eclipse版本有沒(méi)有這么貼心.
        從configuration中搜索remote 模版,點(diǎn)擊右上角的create configuration ,就創(chuàng)建好了一個(gè)遠(yuǎn)程debug 啟動(dòng)方式.
        Debugger mode 選擇Attach to remote JVM 即可,它還有一個(gè)選項(xiàng)是Listen to remote JVM ,意如其名嘛,一個(gè)是主動(dòng)附著到啟動(dòng)的程序,一個(gè)是被動(dòng)監(jiān)聽程序。
        ip和端口 不用多說(shuō),筆者直接用的本地jar包,所以填了localhost ,右邊jdk版本如果使用其他版本的,需要調(diào)一下。
        中間的文本框就是生成好的jvm參數(shù)了,非常人性化了,直接加入啟動(dòng)命令即可java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar
        可以完全不用管命令什么意思,如果你想知道,筆者也大概解釋一下:
        • -agentlib:jdwp 最重要的參數(shù),啟動(dòng)JDWP代理,JDWP全稱就是Java Debug Wire Protocol,官方給的方便調(diào)試的工具.
        • transport=dt_socket 通過(guò)socket方式傳輸數(shù)據(jù),dt八成就是data transfer的縮寫了.
        • server=y 開啟調(diào)試server端,注意,因?yàn)楣P者上文選擇的是Attach to remote JVM,所以這里才是y ,等待有調(diào)試器Attach過(guò)來(lái),如果你選了Listen模式,那么就是反過(guò)來(lái)的,調(diào)試器是server,這里就是n 了.
        • suspend=n 是否掛起,這里設(shè)置為n ,也就是說(shuō)程序正常跑,什么時(shí)候需要Attach就去Attach即可,如果設(shè)置為y ,程序?qū)?huì)等待調(diào)試器Attach上才會(huì)繼續(xù)執(zhí)行,比如啟動(dòng)源碼的調(diào)試場(chǎng)景.
        • address=5005 調(diào)試端口設(shè)置為5005,當(dāng)然其它端口也可以.
        啟動(dòng)jar包,再以剛才創(chuàng)建的方式進(jìn)行debug,期待的斷點(diǎn)位置已經(jīng)成功到達(dá)了。

        推薦閱讀:

        2021 編程語(yǔ)言排行榜出爐!

        JWT、JWE、JWS 、JWK 都是什么鬼?還傻傻分不清?

        互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)

        內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級(jí)......等技術(shù)棧!

        ?戳閱讀原文領(lǐng)?。?/span>? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?

        瀏覽 78
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美肥妇bb | 亚洲综合中文字幕在线播放 | 国产成人无码AA片免费看 | 国内少妇毛片视频 | 国产在线观看91 | 看一级黄色录像片 | 日韩精品免费一区二区高清精品 | 一本一道久久综合狠狠躁牛牛影视 | 三上悠亚精品二区 | 国产1234区 |