JDB-步进
本章介绍如何在调试程序中使用单步执行的概念。单步执行是调试器功能,可让您逐行执行代码。使用它,您可以检查每一行代码以确保它们的Behave符合预期。
步进过程中使用以下命令:
- 步骤:进入下一行执行
- 列表:检查您在代码中的位置
- 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() 方法处。
执行在 main 方法的第一行停止,即“int a=5, b=6;” 或代码中的第 11 行。您可以在输出中观察到此信息。
第 2 步:逐步执行代码
以下命令将执行步进到下一行。
main[1] step
现在执行到第 12 行。您将看到以下输出。
第 3 步:列出代码
以下命令列出了代码:
main[1] list
您将得到以下输出。List 命令用于让您知道程序控制已到达代码行。请注意以下屏幕截图中的箭头标记 =>,它显示了程序控件的当前位置。
第四步:继续执行
下面的命令继续执行代码:
main[1] cont
该命令继续执行代码的其余行。输出如下图所示:
> Add:11 The application exited \>
一般来说,步进有以下三种类型:
- 步入
- 跨过
- 走出去
步入
使用此命令,您可以单步执行代码的下一行。如果代码的下一行是函数调用,则通过驱动函数顶行的控件来进入函数。
在下面的代码中,箭头标记定义了代码中的控制器。
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 还执行下一行。但如果下一行是函数调用,它将在后台执行该函数并返回结果。
让我们举个例子。在下面的代码中,箭头标记定义了代码中的控件。
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 执行下一行。如果下一行是函数调用,它将跳过该行,函数继续执行代码的其余行。
让我们举个例子。在下面的代码中,箭头标记定义了代码中的控制器。
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); } }
如果使用步出命令,控制器将移至下一行,即“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); } }