我在學習JDB,遇到了一個悖論。加多寶開始後(用「加多寶類名」)最教程將告訴我鍵入JDB - 如何在運行程序之前獲取方法列表?
>方法的類名
看到可用的方法列表,這樣我就可以把我的斷點。如果我這樣做,加多寶回覆
命令「方法」直到虛擬機開始使用「運行」命令
當然是無效的,如果我說「跑」設置任何斷點前,它貫穿始終;不是很有幫助。我唯一可以斷定的是,jdb希望你能夠盲目設置你的斷點,但是這看起來像是一種粗暴的疏忽,我堅持認爲我只是缺少一個命令。
非常感謝! 喬伊斯
我在學習JDB,遇到了一個悖論。加多寶開始後(用「加多寶類名」)最教程將告訴我鍵入JDB - 如何在運行程序之前獲取方法列表?
>方法的類名
看到可用的方法列表,這樣我就可以把我的斷點。如果我這樣做,加多寶回覆
命令「方法」直到虛擬機開始使用「運行」命令
當然是無效的,如果我說「跑」設置任何斷點前,它貫穿始終;不是很有幫助。我唯一可以斷定的是,jdb希望你能夠盲目設置你的斷點,但是這看起來像是一種粗暴的疏忽,我堅持認爲我只是缺少一個命令。
非常感謝! 喬伊斯
如果你正在調試你自己的程序,我想你會知道類名!
如果它是一個沒有源代碼的程序,那麼要運行它,您必須知道類名包含main()
。如果它位於以java -jar
開頭的罐子中,則該類的名稱位於jar內的清單中。
但事實上你正在運行jdb ClassName
,所以你知道你會跑法ClassName.main()
。對?
如果它是一個web服務中的servlet,那麼servlet的類是web.xml
。
所以在任何這些情況下,你至少應該能夠得到第一種方法。一旦到了,你可以找到其餘的。
我有完全相同的問題。
運行後,所以說:
jdb -classpath build -sourcepath src MyClass
我輸入的文本是在下面以粗體顯示的jdb
會議:
>stop in MyClass.main Deferring breakpoint MyClass.main. It will be set after the class is loaded. >run run MyClass Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable > VM Started: Set deferred breakpoint MyClass.main Breakpoint hit: "thread=main", MyClass.main(), line=798 bci=0 798 MyClass singleton = new MyClass(); main[1] list 797 public static void main(String[] args) { 798 => MyClass singleton = new MyClass(); 799
注意,有方法來創建一個調試會話(見jdb documentation)。
java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
jdb -attach 8000
jdb ClassName
如果您連接,那麼你就需要使用run
命令。
但是,如果你是推出,那麼你做需要使用run
命令(虛擬機尚未啓動)。
這種行爲可以從man jdb
推斷:
運行 - 開始
jdb
,並設置必要的斷點後,使用此 命令來啓動調試應用程序的執行。 只有當jdb
啓動調試應用程序 (而不是附加到現有VM)時,此 命令纔可用。
這就是爲什麼你有錯誤信息。你推出調試器,但沒有使用run command
。 有些教程可能會錯誤地告訴你啓動 jdb,但忘記告訴你執行run
命令。
下面說明如何獲取的方法列表(假設你有一個名爲ClassName
類main
方法)。
附加:
jdb -attach 8000
main[1] stop in ClassName.main
main[1] cont
main[1] methods ClassName
啓動:
jdb ClassName
> stop in ClassName.main
> run
main[1] methods ClassName
提示:看加多寶的命令提示符。有時它是>
,有時它就像main[1]
。如果是>
,那麼虛擬機尚未啓動,並且在使用run
命令之前,命令(如classes
,methods
)將不起作用。如果提示是main[1]
,則虛擬機已啓動並且所需的命令將起作用。
我可以斷定,唯一的事情是,加多寶期待您設置斷點盲目
這是很難單獨使用調試器設置breakboints。你需要在別處查看你的源代碼。您可能會知道至少一種方法的名稱,並使用 stop in ClassName.MethodName
來設置初始斷點。如果你不知道哪裏可以破解,你總是可以使用stop in ClassName.Main
在你的主要方法上設置一個斷點。 請記住,當調試器運行時,您可以設置更多的斷點。另外,您可能會發現,list
命令很有用 - 它顯示了與當前斷點命中對應的源代碼。
爲什麼你不能使用IDE? – 2010-07-18 17:46:22