在jdb中的很多命令都比较好理解,也很容易使用
但是list命令缺总弄不好,总是报“找不到源文件”;此时应该使用use命令来链接源文件
但是use的用法写的太简单了,只是说要跟源文件夹路径,但是也没说是相对哪儿的路径,经过一下午的试验,终于找到了规律
1.如果在工程路径下使用jdb,E:\workspace_RIA\HStudy>jdb -classpath classes jvm.init.Example5E:\workspace_RIA\HStudy>jdb -classpath classes jvm.init.Example5 正在初始化 jdb... > stop at jvm.init.Example5:7 正在延迟 断点 jvm.init.Example5:7。 将在装入类之后对其进行设置。 > run 运行 jvm.init.Example5 设置 未捕捉到 java.lang.Throwable 设置延迟的 未捕捉到 java.lang.Throwable > VM 已启动: 设置延迟的 断点 jvm.init.Example5:7 断点命中: "thread=main", jvm.init.Example5.main(), line=7 bci=4 main[1] list 找不到源文件: Example5.java main[1] use classes main[1] use src main[1] list 3 public class Example5 { 4 public static void main(String[] args) { 5 int a = 2; 6 int b = 3; 7 => if (args.length < 2) { 8 System.out.println("Must enter any two args."); 9 return; 10 } 11 12 System.out.println(args[0] + args[1]); main[1]
进入jdb后可以使用use命令查看当前链接源文件的路径,在上面这个例子中默认是classes文件夹,这是咱们在classpath选项中设置的。use命令也可以用来修改链接源文件的路径,上例中使用use src将路径改到src目录下,然后list命令就能起作用了
2.不在工程路径下运行jdb,而是在classes目录下运行jdb jvm.init.Example5
E:\workspace_RIA\HStudy\classes>jdb jvm.init.Example5 正在初始化 jdb... > stop at jvm.init.Example5:7 正在延迟 断点 jvm.init.Example5:7。 将在装入类之后对其进行设置。 > run 运行 jvm.init.Example5 设置 未捕捉到 java.lang.Throwable 设置延迟的 未捕捉到 java.lang.Throwable > VM 已启动: 设置延迟的 断点 jvm.init.Example5:7 断点命中: "thread=main", jvm.init.Example5.main(), line=7 bci=4 main[1] locals 方法参数: args = instance of java.lang.String[0] (id=323) 局部变量: a = 2 b = 3 main[1] list 找不到源文件: Example5.java main[1] use .; main[1] list 3 public class Example5 { 4 public static void main(String[] args) { 5 int a = 2; 6 int b = 3; 7 => if (args.length < 2) { 8 System.out.println("Must enter any two args."); 9 return; 10 } 11 12 System.out.println(args[0] + args[1]); main[1]
可以用use命令查看当前的链接源文件的路径是".",也就是classes目录,当然是无法链接源文件的。
此时若将src下的Example5.java移入到classes/jvm/init/目录下,然后执行list,发现就可以链接到源文件了
但是通常我们的目录结构是这样子的:
Project
-src
-classes
如果我们是在classes目录下运行的jdb,那么.代表当前目录,.\..\src就能访问到源码
所以我们可以用use .\..\src来链接源码