Java 调试器(JDB)是 JDK 内置的命令行工具。从调试的指令和命令行接口两方面看的话,JDB 至少从概念上是 GNU 调试器(GDB,受 Unix DB 的影响)的继承者。
示例:
public class SimpleDebugging {
private static void foo1() {
System.out.println("In foo1");
foo2();
}
private static void foo2() {
System.out.println("In foo2");
foo3();
}
private static void foo3() {
System.out.println("In foo3");
int j = 1;
j--;
int i = 5 / j;
}
public static void main(String[] args) {
foo1();
}
}
输出:
In foo1
In foo2
In foo3
Exception in thread "main" java.lang.ArithmeticException: / by zero
at validating.SimpleDebugging.foo3(SimpleDebugging.java:23)
at validating.SimpleDebugging.foo2(SimpleDebugging.java:16)
at validating.SimpleDebugging.foo1(SimpleDebugging.java:11)
at validating.SimpleDebugging.main(SimpleDebugging.java:27)
为了运行 JDB,你需要在编译 SimpleDebugging.java 时加上 -g 标记,从而告诉编译器生成编译信息。
1.在 IDEA 上找到 java 文件的位置
2.打开 cmd
3.编译单个 java 文件
在 cmd 中输入命令:
javac -g SimpleDebugging.java
出现中文乱码
输入下面的命令解决:
javac -encoding utf-8 -g SimpleDebugging.java
在文件夹中出现编译后的 class 文件
4.执行 JDB 命令
jdb SimpleDebugging
注意:不带 class 后缀。
接着 JDB 就会运行,出现命令行提示。你可以输入 ? 查看可用的 JDB 命令。
输入:
catch Exception
命令 catch Exception 在任何抛出异常的地方设置断点。
继续输入:
run
结果出现找不到主类错误
5.后续操作
在源码中将包信息注释掉
再重新运行以下命令:
javac -encoding utf-8 -g SimpleDebugging.java
jdb SimpleDebugging
catch Exception
run
现在程序将运行到下个断点处,在这个例子中就是异常发生的地方。下面是运行 run 命令的结果:
程序运行到第16行时发生异常,但是 JDB 在异常发生时就不复存在。调试器还展示了是哪一行导致了异常。你可以使用 list 将导致程序终止的执行点列出来:
list
命令 locals 能转储所有的局部变量值:
locals
命令 wherei 打印进入当前线程的方法栈中的栈帧信息:
wherei