- JDB 教程
- JDB - 首页
- JDB - 简介
- JDB - 安装
- JDB - 语法
- JDB - 选项
- JDB - 会话
- JDB - 基本命令
- JDB - 断点
- JDB - 单步调试
- JDB - 异常
- JDB - 在 Eclipse 中使用
- JDB 有用资源
- JDB - 快速指南
- JDB - 有用资源
- JDB - 讨论
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() 方法)停止。
执行停在 main 方法的第一行,“int a=5, b=6;” 或代码中的第 11 行。您可以在输出中观察到此信息。
步骤 2:单步执行代码
以下命令将执行单步执行到下一行。
main[1] step
现在执行单步执行到第 12 行。您将看到以下输出。
步骤 3:列出代码
以下命令列出代码:
main[1] list
您将得到以下输出。list 命令用于让您知道程序控制已到达的代码行。请注意以下屏幕截图中的箭头标记 =>,它显示了程序控制的当前位置。
步骤 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); } }