当前位置:  技术问答>java相关

怎样使用jdb?

    来源: 互联网  发布时间:2015-05-07

    本文导语:  听说SUN公司提供的免费的debugger(jdb)工具很好使,但是我就不知怎样去用,不如进入以后敲入help后,怎样让帮助一页一页的显示? | ** command list ** run [class [args]]        -- start execut...

听说SUN公司提供的免费的debugger(jdb)工具很好使,但是我就不知怎样去用,不如进入以后敲入help后,怎样让帮助一页一页的显示?

|
** command list **
run [class [args]]        -- start execution of application's main class

threads [threadgroup]     -- list threads
thread         -- set default thread
suspend [thread id(s)]    -- suspend threads (default: all)
resume [thread id(s)]     -- resume threads (default: all)
where [thread id] | all   -- dump a thread's stack
wherei [thread id] | all  -- dump a thread's stack, with pc info
up [n frames]             -- move up a thread's stack
down [n frames]           -- move down a thread's stack
kill        -- kill a thread with the given exception object
interrupt         -- interrupt a thread

print               -- print value of expression
dump                -- print all object information
eval                -- evaluate expression (same as print)
set  =      -- assign new value to field/variable/array element
locals                    -- print all local variables in current stack frame

classes                   -- list currently known classes
class           -- show details of named class
methods         -- list a class's methods
fields          -- list a class's fields

threadgroups              -- list threadgroups
threadgroup         -- set current threadgroup

stop in .[(argument_type,...)]
                          -- set a breakpoint in a method
stop at : -- set a breakpoint at a line
clear .[(argument_type,...)]
                          -- clear a breakpoint in a method
clear :   -- clear a breakpoint at a line
clear                     -- list breakpoints
catch           -- break when specified exception thrown
ignore          -- cancel 'catch'  for the specified exception
watch [access|all] .
                          -- watch access/modifications to a field
unwatch [access|all] .
                          -- discontinue watching access/modifications to a field
trace methods [thread]    -- trace method entry and exit
untrace methods [thread]  -- stop tracing method entry and exit
step                      -- execute current line
step up                   -- execute until the current method returns to its caller
stepi                     -- execute current instruction
next                      -- step one line (step OVER calls)
cont                      -- continue execution from breakpoint

list [line number|method] -- print source code
use (or sourcepath) [source file path]
                          -- display or change the source path
exclude [class id ... | "none"]
                          -- do not report step or method events for specified classes
classpath                 -- print classpath info from target VM

monitor          -- execute command each time the program stops
monitor                   -- list monitors
unmonitor       -- delete a monitor
read            -- read and execute a command file

lock                -- print lock info for an object
threadlocks [thread id]   -- print lock info for a thread

pop                       -- pop the stack through and including the current frame
reenter                   -- same as pop, but current frame is reentered
redefine  
                          -- redefine the code for a class

disablegc           -- prevent garbage collection of an object
enablegc            -- permit garbage collection of an object

!!                        -- repeat last command
              -- repeat command n times
help (or ?)               -- list commands
version                   -- print version information
exit (or quit)            -- exit debugger

: full class name with package qualifiers or a 
pattern with a leading or trailing wildcard ('*').
: thread number as reported in the 'threads' command
: a Java(tm) Programming Language expression.
Most common syntax is supported.

Startup commands can be placed in either "jdb.ini" or ".jdbrc"
in user.home or user.dir

|
当新手开始学习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等,还有远程调试等内容,都很有用。这里就不一一介绍了。 


呵呵,满意了吧.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3