JDK of JAVA

当新手开始学习Java时,在一开始的新鲜感后马上就会发现的一个问题就是如何调试。大家知道在Visual   C++中提供了很好的调试工具,使用起来特别的方便。Java中,以JDK为例,没有一个方便的图形界面,所以给新手调试带来了很多的困难。很多人一开始是用System.out.println()来观察输出结果。如果写的程序很大,这样的方法就显然是效率太低。下面结合自己的学习体会简单谈一下Java中的调试工具JDB的使用。
环境:jdk   1.2.2  

首先我们写一个最简单的小程序,但是它包含了一些最基本的面向对象要素。  
class   test
{
int   a;
int   b;
test(int   aa,int   bb)
{
a   =   aa;
b   =   bb;
}
int   add()
{return   a+b;}
}
public   class   hehe
{
public   static   void   main(String   args[])
{
int   a   =   2;
int   b   =   3;
int   c=   a+b;
System.out.println(c);
test   kk=new   test(1,2);
System.out.println(kk.add());
}
}
 


存为hehe.java后,用javac   -g   hehe.java进行编译。用参数g是为了产生各种调试信息,不用就无法调试。如果这里遇到问题,请参考Helloworld攻略。上面的程序是可以通过的,可以直接用java   hehe运行。下面结合该例子谈谈JDB的使用。  

首先键入jdb   hehe   如果出现下面信息,说明系统没有找到调试的类。此时可以用java   -classpath   .   hehe命令解决。  
C:/javasource>jdb   hehe
Initializing   jdb...
hehe   not   found
>
 


如果出现一下信息,说明开始进行调试,一切正常。如果是调试Applet,则用   appletviewer   -debug   hehe.html命令进行调试  
C:/javasource>jdb   -classpath   .   hehe
Initializing   jdb...
0xb0:class(hehe)
>
 


回想VC中的调试,应该是设置断点,然后再进行跟踪。Java中也是一样。用stop命令进行断点设置。然后用   run   命令开始调试,运行程序到断点,这里断点是设置在   main   主函数中。  
>   stop   at   hehe:18
Breakpoint   set   at   hehe:18
>   run
run   hehe
running   ...
main[1]
Breakpoint   hit:   hehe.main   (hehe:18)
main[1]
 


此时可以用locals命令查看变量,用step命令进入下一条命令,也可以用单独一个stop命令来查看断点的设置情况。注意此时b还没有被赋值。   main[1]   locals
Method   arguments:
Local   variables:
    args   =
    a   =   2
main[1]   step
main[1]
Breakpoint   hit:   hehe.main   (hehe:19)
main[1]
 


当运行到System.out.println()函数时,会出现一下提示:  
main[1]   step
main[1]
Breakpoint   hit:   java.lang.ClassLoader.loadClass   (ClassLoader:247)
 


这个是因为我们跟踪进去了println方法,我们一般没有必要这样做,此时可以用next跳过该方法进入到下一条一句。step的含义是进入函数跟踪,next是转入下一条语句执行。我们随时可以键入   locals   和   list   命令来查看变量值和当前运行的代码。下面箭头指到地方即为当前程序运行到的地方。  
main[1]   next
main[1]
Breakpoint   hit:   hehe.main   (hehe:20)
main[1]   list
16                             {
17                                             int   a   =   2;
18                                             int   b   =   3;
19                                             int   c=   a+b;
20             =>                             System.out.println(c);
21                                             test   kk=new   test(1,2);
22                                             System.out.println(kk.add());
23
24                             }
main[1]
 


接下来的问题自然是如何查看对象。当程序运行到new命令处时,键入locals,可以看到   main[1]   step
main[1]
Breakpoint   hit:   test.   (test:5)
main[1]   list
1                     class   test
2                     {
3                               int   a;
4                               int   b;
5               =>             test(int   aa,int   bb)
6                               {
7                                               a   =   aa;
8                                               b   =   bb;
9                                               }
main[1]   locals
Method   arguments:
Local   variables:
    this   =   test@64fd6722
    aa   =   1
    bb   =   2
main[1]
 


可以看到此时显示的变量值是类test中构造函数中的变量值。this对象即为当前构造的对象。可以用dump命令进行查看。  
main[1]   dump   this
this   =   (test)0x11a   {
        int   b   =   0
        int   a   =   0
}
 


也可以在main函数中用dump   kk和print命令命令进行对象查看   main[1]   dump   kk
kk   =   (test)0x11a   {
        int   b   =   2
        int   a   =   1
}
main[1]   print   kk
kk   =   test@64fd6722
main[1]   print   kk.a
kk.a   =   1
main[1]   print   kk.b
kk.b   =   2
 


最后键入cont命令,如果没有其他断点,程序就直接运行完毕退出。调试结束。   main[1]   cont
3

>   Current   thread   "main"   died.   Execution   continuing...
>
hehe   exited

 


上述操作中的断点都是设置在main函数中的,如果要设置在调用的类方法中,则要用   stop   in   yourclassname.functionname   命令来进行设置,比如说:   >   stop   in   test.add
Breakpoint   set   in   test.add
>   run
run   hehe
running   ...
main[1]   5
Breakpoint   hit:   test.add   (test:11)
main[1]   list
7                                               a   =   aa;
8                                               b   =   bb;
9                                               }
10                             int   add()
11             =>             {return   a+b;}
12                   }
13                   public   class   hehe
14                   {
15                             public   static   void   main(String   args[])
main[1]

 


这样的话,我们已经可以在程序中的几乎所有需要地方的地方进行断点设置并进行跟踪,查看变量。  
JDB还有很多的调试手段,除了上面那些最常用的,其他很重要的还有clear清除断点,use设置源程序路径,memory显示当前内存使用状况,gc强制进行内存回收,!!重复上面的命令,thread设置当前线程,quit和exit退出jdb等,还有远程调试等内容,都很有用。这里就不一一介绍了。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值