JDB - 單步除錯



本章解釋如何使用單步除錯的概念來除錯程式。單步除錯是偵錯程式的功能,允許您逐行執行程式碼。使用此功能,您可以檢查每一行程式碼以確保其按預期執行。

單步除錯過程中使用以下命令:

  • step:單步執行到下一行。
  • list:檢視當前程式碼位置。
  • cont:繼續執行剩餘程式碼。

示例

以下示例使用我們在上一章中使用的 Add 類。

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
      Add ob = new Add();
      
      int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

將以上檔案儲存為 Add.java。使用以下命令編譯此檔案:

\>javac Add.java

假設在 Add 類的 main() 方法上設定了斷點。以下步驟展示如何在 Add 類中應用單步除錯。

步驟 1:執行作業

以下命令開始執行名為 Add 的類。

> run Add

執行此命令後,您將看到以下輸出。在此輸出中,您可以發現執行在斷點位置(即 main() 方法)停止。

Stepping1

執行停在 main 方法的第一行,“int a=5, b=6;” 或程式碼中的第 11 行。您可以在輸出中觀察到此資訊。

步驟 2:單步執行程式碼

以下命令將執行單步執行到下一行。

main[1] step

現在執行單步執行到第 12 行。您將看到以下輸出。

Stepping2

步驟 3:列出程式碼

以下命令列出程式碼:

main[1] list

您將得到以下輸出。list 命令用於讓您知道程式控制已到達的程式碼行。請注意以下螢幕截圖中的箭頭標記 =>,它顯示了程式控制的當前位置。

Stepping3

步驟 4:繼續執行

以下命令繼續執行程式碼:

main[1] cont

此命令繼續執行程式碼的剩餘行。輸出如下所示:

> Add:11
The application exited
\>

通常,有三種類型的單步除錯:

  • Step Into(步入)
  • Step Over(步過)
  • Step Out(步出)

Step Into(步入)

使用此命令,您可以單步執行到程式碼的下一行。如果下一行程式碼是函式呼叫,則它透過將控制驅動到函式的頂行來進入該函式。

在以下程式碼中,箭頭標記定義了程式碼中的控制器。

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
   -> Add ob = new Add();
      
      int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

如果您使用 **Step Into** 命令,控制器將移動到下一行,即“int c = ob.addition(a,b);”。在這行中,有一個函式呼叫 **addition(int, int)**,因此控制器將移動到 addition 函式的最頂行,箭頭標記如下所示:

public class Add
{
   public int addition( int x, int y)
-> {
      int z = x + y;
      return z;
   }
      
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
      Add ob = new Add();
      
      int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

Step Over(步過)

Step Over 也執行下一行。但是,如果下一行是函式呼叫,它會在後臺執行該函式並返回結果。

讓我們舉個例子。在以下程式碼中,箭頭標記定義了程式碼中的控制。

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
   -> Add ob = new Add();
   
      int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

如果您使用 **Step Over** 命令,控制器將移動到下一行,即“int c = ob.addition(a,b);”。在這行中,有一個函式呼叫 **addition(int, int)**,因此函式執行在後臺完成,結果將帶有箭頭標記返回到當前行,如下所示:

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
      Add ob = new Add();
      
   -> int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

Step Out(步出)

Step Out 執行下一行。如果下一行是函式呼叫,它會跳過該呼叫,並且函式執行將繼續執行程式碼的剩餘行。

讓我們舉個例子。在以下程式碼中,箭頭標記定義了程式碼中的控制器。

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
   -> Add ob = new Add();
   
      int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}

如果您使用 **Step Out** 命令,控制器將移動到下一行,即“int c = ob.addition(a,b);”。在這行中,有一個函式呼叫 **addition(int, int)**,因此函式執行將被跳過,並且剩餘的執行將繼續,箭頭標記如下所示:

public class Add
{
   public int addition( int x, int y)
   {
      int z = x + y;
      return z;
   }
   
   public static void main( String ar[ ] )
   {
      int a = 5, b = 6;
      Add ob = new Add();
      
   -> int c = ob.addition(a,b);
      System.out.println("Add: " + c);
   }
}
廣告