jdb[JAVA調試器]

jdb[JAVA調試器]
更多義項 ▼ 收起列表 ▲

JDB是基於文本和命令行的調試工具(例如Sun JDB);雖然現在有一些很好的調試工具,然而 Java 調試器 (JDB) 提供了一些優點。最重要的是 JDB 可以免費獲取並且是平台獨立的。其缺點是它只有命令行格式,一些開發人員認為這很原始,而且難以使用。一些 IDE 已經將 GUI 界面構建到 JDB 調試 API(如 Jikes)。JDB 是 JDK 安裝的一部分。它在 Java 2 平台中得到了增強。

命令列表

1. ** 命令列表 **

2. connectors - 列出此 VM 中可用的連線器和傳送器 3.

4.run[類 [參數]] - 開始執行應用程式的主類 5.

6. threads [執行緒組] - 列出執行緒 7. thread <執行緒 ID> - 設定默認執行緒

8. suspend [執行緒 ID] - 暫停執行緒(默認為所有執行緒) 9. resume [執行緒 ID] - 恢複線程(默認為所有執行緒) 10. 其中 [<執行緒 ID> | all] - 轉儲執行緒的堆疊

11. 其中 [<執行緒 ID> | all] - 轉儲執行緒的堆疊,以及 pc 信息 12. up [n 幀] - 向上移動執行緒的堆疊 13. down [n 幀] - 向下移動執行緒的堆疊

14. kill <執行緒 ID> <表達式> - 中止具有給定的異常對象的執行緒 15. interrupt <執行緒 ID> - 中斷執行緒 16.

17. print <表達式> - 輸出表達式的值 18. dump <表達式> - 輸出所有對象信息

19. eval <表達式> - 輸出表達式的值(與 print 相同) 20. set <lvalue> = <表達式> - 為欄位/變數/數組元素指定新值 21. locals - 輸出當前堆疊幀中的所有局部變數 22.

23. classes - 列出當前已知的類 24. class <類 ID> - 顯示已命名的類的詳細信息 25. methods <類 ID> - 列出類的方法 26. fields <類 ID> - 列出類的欄位 27.

28. threadgroups - 列出執行緒組 29. threadgroup <名稱> - 設定當前執行緒組 30.

31. stop in <類 ID>.<方法>[(參數類型,...)]

32. - 在方法中設定斷點 33. stop at <類 ID>:<行> - 在行中設定斷點 34. clear <類 ID>.<方法>[(參數類型,...)]

35. - 清除方法中的斷點 36. clear <類 ID>:<行> - 清除行中的斷點 37. clear - 列出斷點 38. catch [uncaught|caught|all] <類 ID>|<類模式>

39. - 出現指定的異常時中斷 40. ignore [uncaught|caught|all] <類 ID>|<類模式>

41. -- 對於指定的異常,取消 "catch" 42. watch [access|all] <類 ID>.<欄位名>

43. - 監視對欄位的訪問/修改 44. unwatch [access|all] <類 ID>.<欄位名>

45. - 停止監視對欄位的訪問/修改 46. trace methods [執行緒] - 跟蹤方法輸入和退出 47. untrace methods [執行緒] - 停止跟蹤方法輸入和退出 48. step - 執行當前行

49. step up - 執行到當前方法返回到其調用程式 50. stepi - 執行當前指令

51. next - 跳過一行(跨過調用) 52. cont - 從斷點處繼續執行 53.

54. list [line number|method] - 輸出原始碼 55. use(或 sourcepath) [源檔案路徑]

56. - 顯示或更改源路徑 57. exclude [<類模式>, ...| “無”]

58. - 對於指定的類,不報告步驟或方法事件 59. classpath - 從目標 VM 輸出類路徑信息 60.

61. monitor <命令> - 每次程式停止時執行命令 62. monitor - 列出監視器 63. unmonitor <監視器號> - 刪除監視器

64. read <檔案名稱> - 讀取並執行命令檔案 65.

66. lock <表達式> - 輸出對象的鎖信息 67. threadlocks [執行緒 ID] - 輸出執行緒的鎖信息 68.

69. pop - 彈出整個堆疊,且包含當前幀 70. reenter - 與 pop 相同,但重新輸入當前幀 71. redefine <類 ID> <類檔案名稱>

72. - 重新定義類的代碼 73.

74. disablegc <表達式> - 禁止對象的垃圾收集 75. enablegc <表達式> - 允許對象的垃圾收集 76.

77. !! - 重複執行最後一個命令 78. <n> <命令> - 將命令重複執行 n 次 79. help(或 ?) - 列出命令 80. version - 輸出版本信息 81. exit(或 quit) - 退出調試器 82.

83. <類 ID>:帶有軟體包限定符的完整類名 84. <類模式>:帶有前導或後綴通配符 (*) 的類名 85. <執行緒 ID>: "threads" 命令中報告的執行緒號 86. <表達式>:Java(TM) 程式語言表達式。 87. 支持大多數常見語法。 88.

89. 可以將啟動命令置於 "jdb.ini" 或 ".jdbrc" 之中 90. (兩者位於 user.home 或 user.dir 中

使用實例

17. args = instance of java.lang.String[0] (id=323) 18. 局部變數: 19. a = 2 20. b = 3

21. main[1] next 22. >

23. 已完成步驟: "thread=main", jvm.init.Example5.main(), line=8 bci=10 24.

25. main[1]

首先我們寫一個最簡單的小程式,但是它包含了一些最基本的面向對象要素。 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等,還有遠程調試等內容,都很有用

相關詞條

相關搜尋

熱門詞條

聯絡我們