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);
   }
}
广告