JDB 的簡單使用



 

原文:http://blog.csdn.net/fenglibing/article/details/6411999

JDK內置工具使用

一、javah命令(C Header and Stub File Generator)

二、jps命令(Java Virtual Machine Process Status Tool)

三、jstack命令(Java Stack Trace)

四、jstat命令(Java Virtual Machine Statistics Monitoring Tool)

五、jmap命令(Java Memory Map)

六、jinfo命令(Java Configuration Info)

七、jconsole命令(Java Monitoring and Management Console)

八、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)

九、jhat命令(Java Heap Analyse Tool)

十、Jdb命令(The Java Debugger)

十一、參考

http://www.renren.it/a/JAVAbiancheng/JAVAzonghe/20110511/jni-example.html

http://blog.csdn.net/gtuu0123/archive/2010/11/27/6039474.aspx

http://blog.csdn.net/kelly859/archive/2010/07/30/5775318.aspx

http://www.51testing.com/?uid-77492-action-viewspace-itemid-203728

http://blog.csdn.net/dengmc/archive/2009/05/13/4174738.aspx

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html


 

原文:http://www.ibm.com/developerworks/cn/java/joy-jdb/index.html

 

首先我們寫一個最簡單的小程序,但是它包含了一些最基本的面向對象要素。

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等,還有遠程調試等內容,都很有用。這里就不一一介紹了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM