2010-07-17 64 views
7

我在學習JDB,遇到了一個悖論。加多寶開始後(用「加多寶類名」)最教程將告訴我鍵入JDB - 如何在運行程序之前獲取方法列表?

>方法的類名

看到可用的方法列表,這樣我就可以把我的斷點。如果我這樣做,加多寶回覆

命令「方法」直到虛擬機開始使用「運行」命令

當然是無效的,如果我說「跑」設置任何斷點前,它貫穿始終;不是很有幫助。我唯一可以斷定的是,jdb希望你能夠盲目設置你的斷點,但是這看起來像是一種粗暴的疏忽,我堅持認爲我只是缺少一個命令。

非常感謝! 喬伊斯

+0

爲什麼你不能使用IDE? – 2010-07-18 17:46:22

回答

1

如果你正在調試你自己的程序,我想你會知道類名!

如果它是一個沒有源代碼的程序,那麼要運行它,您必須知道類名包含main()。如果它位於以java -jar開頭的罐子中,則該類的名稱位於jar內的清單中。

但事實上你正在運行jdb ClassName,所以你知道你會跑法ClassName.main()。對?

如果它是一個web服務中的servlet,那麼servlet的類是web.xml

所以在任何這些情況下,你至少應該能夠得到第一種方法。一旦到了,你可以找到其餘的。

0

我有完全相同的問題。

運行後,所以說:

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   
1

注意,有方法來創建一個調試會話(見jdb documentation)。

  1. 附加 - 我們的程序加載到虛擬機時,它會暫停的端口(例如8000)上偵聽。然後在另一個終端會話中,我們加載jdb並通過指定端口將其附加到JVM會話。
    • 在一個termial會話:java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
    • 在第二終端會話
    • jdb -attach 8000
  2. 啓動 - 負載JDB並告訴它的類的名稱來加載。
    • 在一個終端會話:jdb ClassName

如果您連接,那麼你就需要使用run命令。
但是,如果你是推出,那麼你需要使用run命令(虛擬機尚未啓動)。


這種行爲可以從man jdb推斷:

運行 - 開始jdb,並設置必要的斷點後,使用此 命令來啓動調試應用程序的執行。 只有當jdb啓動調試應用程序 (而不是附加到現有VM)時,此 命令纔可用。

這就是爲什麼你有錯誤信息。你推出調試器,但沒有使用run command。 有些教程可能會錯誤地告訴你啓動 jdb,但忘記告訴你執行run命令。


下面說明如何獲取的方法列表(假設你有一個名爲ClassNamemain方法)。

  1. 附加
    jdb -attach 8000
    main[1] stop in ClassName.main
    main[1] cont
    main[1] methods ClassName

  2. 啓動
    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命令很有用 - 它顯示了與當前斷點命中對應的源代碼。

相關問題