<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### [使用 JDB 調試](https://lingcoder.gitee.io/onjava8/#/book/16-Validating-Your-Code?id=%e4%bd%bf%e7%94%a8-jdb-%e8%b0%83%e8%af%95) Java 調試器(JDB)是 JDK 內置的命令行工具。從調試的指令和命令行接口兩方面看的話,JDB 至少從概念上是 GNU 調試器(GDB,受 Unix DB 的影響)的繼承者。JDB 對于學習調試和執行簡單的調試任務來說是有用的,而且知道只要安裝了 JDK 就可以使用 JDB 是有幫助的。然而,對于大型項目來說,你可能想要一個圖形化的調試器,這在后面會描述。 假設你寫了如下程序: ~~~ // validating/SimpleDebugging.java // {ThrowsException} public class SimpleDebugging { private static void foo1() { System.out.println("In foo1"); foo2(); } private static void foo2() { System.out.println("In foo2"); foo3(); } private static void foo3() { System.out.println("In foo3"); int j = 1; j--; int i = 5 / j; } public static void main(String[] args) { foo1(); } } /* Output In foo1 In foo2 In foo3 __[Error Output]__ Exception in thread "main" java.lang.ArithmeticException: /by zero at SimpleDebugging.foo3(SimpleDebugging.java:17) at SimpleDebugging.foo2(SimpleDebugging.java:11) at SimpleDebugging.foo1(SimpleDebugging.java:7) at SimpleDebugging.main(SimpleDebugging.java:20) ~~~ 首先看方法`foo3()`,問題很明顯:除數是 0。但是假如這段代碼被埋沒在大型程序中(像這里的調用序列暗示的那樣)而且你不知道從哪兒開始查找問題。結果呢,異常會給出足夠的信息讓你定位問題。然而,假設事情更加復雜,你必須更加深入程序中來獲得比異常提供的更多的信息。 為了運行 JDB,你需要在編譯**SimpleDebugging.java**時加上**\-g**標記,從而告訴編譯器生成編譯信息。然后使用如下命令開始調試程序: **jdb SimpleDebugging** 接著 JDB 就會運行,出現命令行提示。你可以輸入**?**查看可用的 JDB 命令。 這里展示了如何使用交互式追蹤一個問題的調試歷程: **Initializing jdb...** **\> catch Exception** `>`表明 JDB 在等待輸入命令。命令**catch Exception**在任何拋出異常的地方設置斷點(然而,即使你不顯式地設置斷點,調試器也會停止— JDB 中好像是默認在異常拋出處設置了異常)。接著命令行會給出如下響應: **Deferring exception catch Exception.** **It will be set after the class is loaded.** 繼續輸入: **\> run** 現在程序將運行到下個斷點處,在這個例子中就是異常發生的地方。下面是運行**run**命令的結果: **run SimpleDebugging** **Set uncaught java.lang.Throwable** **Set deferred uncaught java.lang.Throwable** **\>** **VM Started: In foo1** **In foo2** **In foo3** **Exception occurred: java.lang.ArithmeticException** **(uncaught)"thread=main",** **SimpleDebugging.foo3(),line=16 bci=15** **16 int i = 5 / j** 程序運行到第16行時發生異常,但是 JDB 在異常發生時就不復存在。調試器還展示了是哪一行導致了異常。你可以使用**list**將導致程序終止的執行點列出來: **main\[1\] list** **12 private static void foo3() {** **13 System.out.println("In foo3");** **14 int j = 1;** **15 j--;** **16 => int i = 5 / j;** **17 }** **18 public static void main(String\[\] args) {** **19 foo1();** **20 }** **21 }** \**/*Output:\*\* 上述`=>`展示了程序將繼續運行的執行點。你可以使用命令**cont**(continue) 繼續運行,但是會導致 JDB 在異常發生時退出并打印出棧軌跡信息。 命令**locals**能轉儲所有的局部變量值: **main\[1\] locals** **Method arguments:** **Local variables:** **j = 0** 命令**wherei**打印進入當前線程的方法棧中的棧幀信息: **main\[1\] wherei** **\[1\] SimpleDebugging.foo3(SimpleDebugging.java:16), pc =15** **\[2\] SimpleDebugging.foo2(SimpleDebugging.java:10), pc = 8** **\[3\] SimpleDebugging.foo1(SimpleDebugging.java:6), pc = 8** **\[4\] SimpleDebugging.main(SimpleDebugging.java:19), pc = 10** **wherei**后的每一行代表一個方法調用和調用返回點(由程序計數器顯示數值)。這里的調用序列是**main()**,**foo1()**,**foo2()**和 \*\*foo3()\*\*。 因為命令**list**展示了執行停止的地方,所以你通常有足夠的信息得知發生了什么并修復它。命令**help**將會告訴你更多關于**jdb**的用法,但是在花更多的時間學習它之前必須明白命令行調試器往往需要花費更多的精力得到結果。使用**jdb**學習調試的基礎部分,然后轉而學習圖形界面調試器。
                  <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>

                              哎呀哎呀视频在线观看