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) 因此控制器移动到带有箭头标记的加法函数的最上面一行,如下所示:

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