原文:http://blog.csdn.net/fenglibing/article/details/6411999
一、javah命令(C Header and Stub File Generator)
二、jps命令(Java Virtual Machine Process Status Tool)
四、jstat命令(Java Virtual Machine Statistics Monitoring Tool)
六、jinfo命令(Java Configuration Info)
七、jconsole命令(Java Monitoring and Management Console)
八、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)
九、jhat命令(Java Heap Analyse Tool)
十一、參考
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等,還有遠程調試等內容,都很有用。這里就不一一介紹了。