<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 ~~~ f8: 逐行執行 f7: 跳到方法里面 f9: 到下一個斷點,沒有就結束 ctrl+f12 退出debug ~~~ # 斷點調試的小窗口 step over:可以單步執行代碼,會把函數調用當做一行代碼直接執行 step into:可以單步執行代碼,如果是函數,會進入函數內部 ![](https://box.kancloud.cn/4317a3e8b2ba62e7b41c36a70ace1c82_338x828.png) Variables : 可以觀察到所有全局變量、當前局部變量的數值 Watches : 可以新增變量,觀察變量隨著程序執行的變化 ![](https://box.kancloud.cn/554c63465968d177bdd60027c972ed54_1481x598.png) 1. rerun XXX,這個就是直接重新跑某個程序。 2. 這個相當于eclipse里面的f8,直接跑完,到下一個斷點停下,沒有就直接跑完程序。 3. 停止項目或者程序。要是自己的main呢,點一下就停下了,要是Java web項目,則點2下,就把服務器給停了。 4. 查看所有的斷點設置情況。具體詳情,下面有示意圖,再細細解釋。 5. 直接取消所有斷點,讓所有斷點無效。 6. 要是你一不小心把這個下面的布局給弄亂了,你點這個,就把下面的布局給還原咯。 7. 跳轉到當前代碼所執行的地方,也就是說你在看代碼的時候,點到其他地方,一點這個按鈕,就到了程序執行到當前哪行的代碼的地方。斷點的話就是斷點運行的行 8. 下一步,如果是方法,他是不會跳進去的。就是一行行的往下走。(eclipse里面的快捷鍵就是f6) 9. 跳轉到詳情,如果下一行調試代碼是可執行方法,就可以f5進去,查看這個方法的運行詳細情況。重點就是點進去執行.這個沒有走jdk的那種,有個fore的這個,就是后面那個進去的是會到jdk的. 10. 從詳情跳出去,和上面的9相反。 11. 看字面意思就是跳轉到那個光標所在的地方,前提是他能路上沒斷點攔著。 12. 這個點開之后,可以計算你想要看的代碼段的值,后面詳細上圖。 13. 看意思,同eclipse里面的watch,查看某個對象的值,自定義的對象。 14. 把自定義的查看對象的值,分開到另一個tab頁。 15. 有時候當我們步入方法體之后,還想回退到方法體外,點這個按鈕后,斷點重新回到方法體之外。在繼續還是可以再次進到方法內 * Force Step Into (Alt + Shift + F7):強制步入,能進入任何方法,查看底層源碼的時候可以用這個進入官方類庫的方法。 * Drop Frame (默認無):回退斷點 * Run to Cursor (Alt + F9):運行到光標處,你可以將光標定位到你需要查看的那一行,然后使用這個功能,代碼會運行至光標行,而不需要打斷點。但是要中間沒斷點有斷點還是先走斷點. * Evaluate Expression (Alt + F8):計算表達式 ---- **側邊欄** ![](https://img.kancloud.cn/84/71/84713a65e6df3637d2bb2e0d21825bfd_54x264.png) * Rerun 'xxxx':重新運行程序,會關閉服務后重新啟動程序。 * Update 'tech' application (Ctrl + F5):更新程序,一般在你的代碼有改動后可執行這個功能。而這個功能對應的操作則是在服務配置里,如圖2.3。 * Resume Program (F9):恢復程序,比如,你在第20行和25行有兩個斷點,當前運行至第20行,按F9,則運行到下一個斷點(即第25行),再按F9,則運行完整個流程,因為后面已經沒有斷點了。 * Pause Program:暫停程序,啟用Debug。目前沒發現具體用法。 * Stop 'xxx' (Ctrl + F2):連續按兩下,關閉程序。有時候你會發現關閉服務再啟動時,報端口被占用,這是因為沒完全關閉服務的原因,你就需要查殺所有JVM進程了。 * View Breakpoints (Ctrl + Shift + F8):查看所有斷點 * Mute Breakpoints:啞的斷點,選擇這個后,所有斷點變為灰色,斷點失效,按F9則可以直接運行完程序。再次點擊,斷點變為紅色,有效。如果只想使某一個斷點失效,可以在斷點上右鍵取消Enabled --- 更新程序,On 'Update' actions,執行更新操作時所做的事情,一般選擇'Update classes and resources',即更新類和資源文件.一般配合熱部署插件會更好用,如JRebel,這樣就不用每次更改代碼后還要去重新啟動服務 ![](https://img.kancloud.cn/ee/36/ee36a3f22ff43934e2188ca29c371a7d_520x370.png) # debug模擬異常 選擇然后點擊 ![](https://box.kancloud.cn/0a4cb5e6f83229d43529b7b36839f396_321x220.png) ![](https://box.kancloud.cn/4cb8ef705f0eb2288dbead18dd088916_388x82.png) 斷點那邊下一步,他就會拋出異常 # 查看所有的斷點 ![](https://img.kancloud.cn/ff/8a/ff8ae63adf8bb8dea338765d4f006822_548x700.png) shift+command+f8 ![](https://box.kancloud.cn/c3bc419c6cada5dd31063e71706f2d18_482x350.png) 點這里的more 就會出現 ![](https://box.kancloud.cn/c92db1107f9fb6701c47e84026992a21_1748x990.png) # 斷點棧軌跡 使用IDEA的調用棧迅速了解某段代碼執行的上下文環境,調用棧被掛起之后, 只需要動一動上下方向鍵,就可以快速熟悉這段代碼的執行路徑。 ![](https://box.kancloud.cn/f69bbb165ef38252734580c954081118_610x399.png) 對有需要的斷點(旁邊紅色點下面的)都把他勾上 stacktrace 然后在外面的console這邊就可以看到 ![](https://box.kancloud.cn/724d161ba442a5e2afcd37f4e79893e3_495x283.png) # 跳到下一個斷點 ![](https://box.kancloud.cn/28a3b3b30f3a48c076541c2106f94b37_642x76.png) 如果下個沒有斷點就結束程序運行 # 條件斷點 當滿足某個條件的時候,斷點在生效 雙擊斷點 ![](https://box.kancloud.cn/9735759a954018e2809c2834616c56b0_1404x520.png) 然后在里面寫合法的java表達式就行,比如 == 或者 equals在點擊Done 然后點也頁面上的more在debug 也可以這樣 ![](https://img.kancloud.cn/e3/b5/e3b5a058679781432abb78bfa1a54513_940x405.png) * Java Line Breakpoints 顯示了所有的斷點,在右邊勾選Condition,設置斷點的條件。 * 勾選Log message to console,則會將當前斷點行輸出到控制臺 * 勾選Evaluate and log,可以在執行這行代碼是計算表達式的值,并將結果輸出到控制臺。 再說說右邊的Filters過濾,這些一般情況下不常用,簡單說下意思。 * nstance filters:實例過濾,輸入實例ID(如圖6.5中的實例ID) ![](https://img.kancloud.cn/c1/a3/c1a324d27753881e6fff02c3d8f8f7f0_338x263.png) * Class filters:類過濾,根據類名過濾,同樣沒有成功.... * Pass count:用于循環中,如果斷點在循環中,可以設置該值,循環多少次后停在斷點處,之后的循環都會停在斷點處 # 斷點的一些值 ![](https://box.kancloud.cn/e50ce71ebc59c90c4644ea8499f9b16f_1306x546.png) 比如在斷點中我們想知道一些值 我們可以這樣 右擊 ![](https://box.kancloud.cn/2c1b64080b66fd49742ff6fbc7c08427_668x86.png) 點擊然后出現對話框 ![](https://box.kancloud.cn/ffd41375385917c033e734dd9064a326_504x556.png) 我們可以輸入一些東西,然后回車,符合java表達式就行,比如list.get(0) # 設置值 比如在斷點運行的時候,我們設置一些值看看會發生什么 ![](https://box.kancloud.cn/7caa2454a4c55bd3cf863dbf7416684c_774x448.png) # Smart Step Into 想想,一行代碼里有好幾個方法,怎么只選擇某一個方法進入。之前提到過使用Step Into (Alt + F7) 或者 Force Step Into (Alt + Shift + F7)進入到方法內部,但這兩個操作會根據方法調用順序依次進入,這比較麻煩。 那么智能步入就很方便了,智能步入,這個功能在Run里可以看到,Smart Step Into (Shift + F7) ![](https://img.kancloud.cn/da/0b/da0bb87936f73c1f5303d068bf475dc2_724x1270.png) 按Shift + F7,會自動定位到當前斷點行,并列出需要進入的方法,,點擊方法進入方法內部。 如果只有一個方法,則直接進入,類似Force Step Into。 ![](https://img.kancloud.cn/ae/4f/ae4f4534beaf4f2c37bf635975485bbc_611x189.png) # 設置運行時的參數 ![](https://box.kancloud.cn/acc913add8b382e52ccd6e5907219457_946x382.png) 入口如下,2個地方都可以 ![](https://box.kancloud.cn/7ddace18055121fe30a6c8c0ec084bc5_709x669.png) # 打了斷點,代碼卻么有停下來 ![](https://box.kancloud.cn/681a2a249e942a8850bb06d0c36dbace_1129x250.png) ![](https://box.kancloud.cn/4f402f78cb9c285aebdf8bcaa7f1e488_746x244.png) 可以看到,打斷點時候,有的是對號,有的是個x,x是不可執行的代碼,所以,你要是在代碼類似的地方打斷點的話,代碼就不會停下來,因為這個斷點位置有點尷尬。 # 重置窗口 ![](https://img.kancloud.cn/50/c9/50c941811dd3ebb6603af17f95714f05_946x848.png) # 回退斷點 在調試的時候,想要重新走一下流程而不用再次發起一個請求? 首先認識下這個方法調用棧,首先請求進入DemoController的insertDemo方法,然后調用insert方法,其它的invoke我們且先不管,最上面的方法是當前斷點所在的方法。 ![](https://img.kancloud.cn/99/82/99827870afe153c844c55872fd762e45_909x504.png) 斷點回退 所謂的斷點回退,其實就是回退到上一個方法調用的開始處,在IDEA里測試無法一行一行地回退或回到到上一個斷點處,而是回到上一個方法。 回退的方式有兩種,一種是Drop Frame按鈕(圖8.2),按調用的方法逐步回退,包括三方類庫的其它方法(取消Show All Frames按鈕會顯示三方類庫的方法,如圖8.3)。 第二種方式,在調用棧方法上選擇要回退的方法,右鍵選擇Drop Frame(圖8.4),回退到該方法的上一個方法調用處,此時再按F9(Resume Program),可以看到程序進入到該方法的斷點處了。 但有一點需要注意,斷點回退只能重新走一下流程,之前的某些參數/數據的狀態已經改變了的是無法回退到之前的狀態的,如對象、集合、更新了數據庫數據等等。 ![](https://img.kancloud.cn/5f/f7/5ff7349c515259ef1640bf0998e6266d_772x491.png) ![](https://img.kancloud.cn/6b/b9/6bb9cc96fa579f79fab8ca8354964da3_704x242.png) # 強制返回 想要在Debug的時候,中斷請求,不要再走剩余的流程了? 有些時候,我們看到傳入的參數有誤后,不想走后面的流程了,怎么中斷這次請求呢(后面的流程要刪除數據庫數據呢....),難道要關閉服務重新啟動程序?嗯,我以前也是這么干的。 確切的說,我也沒發現可以直接中斷請求的方式(除了關閉服務),但可以通過Force Return,即強制返回來避免后續的流程。 點擊Force Return,彈出Return Value的窗口,我這個方法的返回類型為Map,所以,我這里直接返回 results,來強制返回,從而不再進行后續的流程。或者你可以new HashMap<>()。 ![](https://img.kancloud.cn/39/0b/390ba5f0576aadb802c280a99473bf51_694x212.png) # 調試lambda/stream 使用這個功能也非常簡單,當程序在lambda表達式的任意處停下時,單擊調試窗口的**Trace Current Stream Chain**按鈕即可。 ![](https://img.kancloud.cn/91/fd/91fd318941cf48f6d53d91cd34ae6706_1158x502.png) 通過IDEA提供的這個功能,我們可以很輕松地看到流在各個步驟之間的變化 ![](https://img.kancloud.cn/8b/75/8b755926a904b2cdcd026318d65e723d_741x458.png) 展平模式(Flat Mode)更是提供了全局的視角: ![](https://img.kancloud.cn/6a/9e/6a9eaefee9550d28af928f4cf2257021_1084x346.png) # 調試lombok 如果只是想暫停一下set或get方法,可以使用字段斷點,只不過可能會在調試中報錯:**Source code does not match the bytecode**,但它能夠工作。 如果想設斷點的是`toString`、`hashCode`等方法,可以在注解上設置斷點,也可以在調試時使用:**Refactor**\->**Delombok**并選擇相對應的注解,然后再使用上文介紹的HotSwap功能,就可以生成代碼并按需調試了。最后別忘記把代碼恢復回來。 ![](https://img.kancloud.cn/b1/59/b15907b5768209f492286793aacbcf5c_712x711.png) # 多線程調試 一般情況下我們調試的時候是在一個線程中的,一步一步往下走。但有時候你會發現在Debug的時候,想發起另外一個請求都無法進行了? 那是因為IDEA在Debug時默認阻塞級別是ALL,會阻塞其它線程,只有在當前調試線程走完時才會走其它線程。可以在View Breakpoints里選擇Thread,然后點擊Make Default設置為默認選項 ![](https://img.kancloud.cn/5c/29/5c29dc0cd50f2dc3e8fc7974c883f66e_958x269.png) 切換線程,在圖7.2中Frames的下拉列表里,可以切換當前的線程,如下我這里有兩個Debug的線程,切換另外一個則進入另一個Debug的線程。 ![](https://img.kancloud.cn/c5/fd/c5fd9ff2e0f2a19aa8c15ccef2d4169b_844x542.png) # 遠程調試 **概述** 原理:本機和遠程主機的兩個 VM 之間使用 Debug 協議通過 Socket 通信,傳遞調試指令和調試信息。 被調試程序的遠程虛擬機:作為 Debug 服務端,監聽 Debug 調試指令。jdwp是Java Debug Wire Protocol的縮寫。 調試程序的本地虛擬機:IDEA 中配置的 `Remote Server`,指定 Debug 服務器的`Host:Port`,以供 Debug 客戶端程序連接。 **設置** IDEA 中指定 Debug 服務器 * 點擊主窗口菜單 Run / Edit Configurations,打開`“Run/Debug Configurations”`窗口; * 點擊工具欄上的“+”按鈕,下拉菜單中選擇“Remote”; * 設置 Host 為遠程服務器的域名或IP,Port=5005; * 復制命令行參數,形如 `-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 ` ![](https://img.kancloud.cn/4e/22/4e22a99446287dd112c7cdf5f41fbd25_835x554.png) ~~~ 配置remote 參數講解 1.Transport:傳輸方式 2.debugger mode:debug模式 一,attach:貼上,也就是遠程調試jar 二,監聽 3.host:遠程調試的ip 4.port:遠程jar的端口號 5.search sources xxx: jar包的源碼 ~~~ **遠程服務中開啟 Debug 服務** **對于jar** ~~~ java -jar -Xdebug -Xrunjdwp:transport=dt_socket,address=遠程連接端口號,server=y,suspend=y jar名稱.jar ~~~ 參數詳解 ~~~ 1.Xdebug: debug方式啟動 2.-Xrunjdwp: java 遠程調試協議 (包含參數以下) 1.transport: 傳輸協議 2.address:遠程連接端口 3.:server:是否是服務 4.suspend:是否掛起 啟動成功后會出現以下命令: Listening for transport dt_socket at address: 5005 ~~~ **對于 SpringBoot** 命令行添加選項,并重啟: ~~~ ## 注意新參數必須在 -jar 之前 jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test.jar ~~~ **對于 Tomcat** 啟動腳本中添加選項,并重啟: ~~~ ## sudo vim $CATALINA_HOME/bin/catalina.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" ~~~ **遠程服務器防火墻端口放行** ~~~ ### sudo vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT ### 重啟生效: sudo systemctl restart iptables ~~~ **開始調試** * 要求:雙方代碼一致,否則遠程調試無法啟動; * 本地啟動剛剛配置的 Remote Server,正常時會看到日志: `Connected to the target VM, address: 'xxx:5005', transport: 'socket'` * 本地 IDEA 代碼中設置斷點 * 瀏覽器或手機 HTTP 訪問服務器 * IDEA 即可在斷點暫停并跟蹤
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看