JDB调试
JDB,意即Java Debugger,主要用來幫助我們查找并修復Java程序中的bug,就是一個調試器。
基本的jdb命令
以下是基本的jdb命令列表。Java調試器支持jdb幫助命令列出的其他命令。
help, or?最重要的jdb命令,用于顯示帶簡要說明的公認的命令列表。run在啟動jdb,并且設置任何必要的斷點之后,你可以使用此命令來啟動待調試的應用程序的執行。只有使用jdb運行待調試的應用程序時(與附加到現有的虛擬機的做法相反),該命令才可用。cont在一個斷點、異常或者步驟之后,繼續待調試的應用程序的執行。print顯示Java對象和原生值。 對于原生類型的變量或字段而言,將會打印實際的值;對于對象而言,將打印一個簡單的描述。請查看下方的dump命令以獲取關于對象的更多信息。
注意: 為了顯示本地變量,包含的類必須使用javac -g 選項進行編譯。
print支持多種包含方法調用的簡單Java表達式,例如:
print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k(i, j, k are primities and either fields or local variables)
print myObj.myMethod()(if myMethod returns a non-null)
print new java.lang.String("Hello").length()dump對于原生值而言,該命令等同于print。對于對象而言,它會打印對象中每個定義的字段的當前值。靜態字段和實例字段均包含在內。threads
列出當前正在運行的線程,并打印出每個線程的名稱和當前狀態,以及可用于其他命令的索引值。例如:
4.(java.lang.Thread)0x1 main running在這個示例中,線程的索引為4,該線程是java.lang.Thread的一個實例,線程名稱為"main",該線程正在運行。
thread選擇一個線程作為當前線程。許多jdb命令都是基于當前線程的設置。該線程可以用上面threads命令中描述的索引值來指定。where不帶參數的where將輸出當前線程的堆棧信息。
where all將輸出當前線程組中所有線程的堆棧信息。wherethreadindex將輸出指定索引的線程的堆棧信息。如果當前線程被掛起(通過諸如一個斷點的事件或掛起命令來實現),使用print和dump變量將打印本地變量和字段。向上向下命令可以選擇當前的棧幀。
斷點
在jdb中,我們可以在指定行號或方法的第一個指令處設置斷點,例如:
stop at MyClass:22(在MyClass第22行源代碼的第一個指令處設置一個斷點)
stop in java.lang.String.length(在java.lang.String.length方法的開始位置設置一個斷點)
stop in MyClass.<init>(<init>標識MyClass的構造函數)
stop in MyClass.<clinit>(<clinit>標識MyClass的靜態初始化代碼)如果一個方法被重載,你也必須指定它的參數類型,以便于斷點能夠選擇適當的方法。例如:
MyClass.myMethod(int,java.lang.String),或者MyClass.myMethod()。我們可以使用語法類似于
clearMyClass:45的clear命令來刪除斷點。使用不帶參數的clear命令可以顯示當前設置的所有斷點列表。使用cont命令可以繼續向下執行。步進
step命令用于向前執行到當前棧幀或被被調用方法的下一行,next命令用于向前執行到當前棧幀的下一行。
異常
如果發生了一個沒有被catch語句捕獲的異常,虛擬機通常會打印該異常的追蹤信息并退出程序。當運行于jdb之下時,無論如何,拋出的異常都會被控制返回到jdb上,然后,你可以使用jdb來診斷異常的原因。
使用catch命令讓待調試的應用程序在其他拋出異常的位置暫停,例如:
catch java.io.FileNotFoundException或catch mypackage.BigTroubleException。指定類(或子類)實例的任何異常都將在異常的拋出位置暫停應用程序。ignore命令用于取消上一個catch命令的作用效果。
注意:ignore命令不會導致待調試的虛擬機忽略指定的異常,而是僅作用于調試器。
命令行選項
當你使用在命令行中使用jdb時,jdb接受大多數與java命令相同的選項參數,包括-D,-classpath,和-X<option>等。
jdb接受如下額外選項:
-help顯示幫助信息。-sourcepath<dir1:dir2:...>指定源代碼文件的搜索路徑。如果此選項未指定,則默認為"."。-attach<address>使用默認的連接機制,將調試器附加到之前運行的虛擬機上。-listen<address>使用標準器連接器在指定的地址等待正在運行的虛擬機進行連接。-listenany使用標準連接器在任何可用的地址等待正在運行的虛擬機進行連接。-launch當啟動jdb時,立即啟動待調試的應用程序。此選項不需要使用運行命令。待調試的應用程序將會運行,然后在加載初始化應用類之前暫停。此時,你可以設置任何必要的斷點,然后使用cont來繼續執行。-listconnectors列出在此虛擬機上可用的連接器。-connect<connector-name>:<name1>=<value1>,...使用命名的連接器和列出的參數值連接目標虛擬機。-dbgtrace [flags]打印正在調試的jdb的相關信息。-tclient以Java HotSpot虛擬機(客戶端)模式運行應用程序。-tserver以Java HotSpot虛擬機(服務器)模式運行應用程序。-Joption傳遞選項參數給Java虛擬機,并用于運行jdb。(Java虛擬機程序的選項參數使用運行命令來傳遞。) 例如,
-J-Xms48m設置啟動內存為48MB。其他選項支持連接調試器的替代機制和虛擬機調試。Java平臺調試器體系結構提供了關于連接方案的附加文檔。
轉發到被調試的進程的選項參數
-v -verbose[:class|gc|jni]啟用冗余模式。-D<name>=<value>設置系統屬性。-classpath<directories separated by ":">列出用于查找類的目錄。-X<option>非標準的目標虛擬機選項。
未完
用法摘要
jdb的用法摘要如下:
jdb [ options ][ class ][ arguments ]
options命令行選項,詳見下面的介紹。class開始調試的類名稱。arguments傳遞給class的main()方法的參數。
描述
Java調試器,jdb,是一個Java類的簡單調試器。它是Java平臺調試器體系結構的一個演示,該體系結構提供對本地或遠程JVM的檢查和調試。
開始一個jdb會話
我們有許多種方式來啟動一個jdb會話。最常用的方法是jdb以待調試的應用程序的main類來運行一個新的JVM。在命令行中,我們可以替換命令中的java為jdb,從而實現該目的。例如,如果你的應用程序main類為MyClass,你可以使用如下jdb命令來調試它:
jdb MyClass
當使用這種方式啟動時,jdb將調用另一個帶任意指定參數的JVM,加載指定的類,并在執行這些類的第一個指令之前停止VM。
使用jdb的另一種方式是將其附加到已經運行的JVM中,想要使用jdb調試的JVM必須使用下列選項參數來啟動。這些選項參數會加載過程調試庫,并指定創建哪種連接。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
例如,下列命令將會運行MyClass應用程序,并允許jdb稍后連接它。
java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n MyClass
你可以使用如下命令將jdb附加到JVM:
jdb -attach jdbconn
注意,在這個例子中,我們并沒有在jdb命令中中指定"MyClass",因為jdb連接到的是一個現有的虛擬機,而不是運行一個新的虛擬機。我們有許多種方式可以將調試器連接到虛擬機,而jdb支持所有的這些方式。Java平臺調試器體系結構有一個與這些連接選項相關的附加文檔。關于啟動一個J2SE 1.4.2或更早版本的虛擬機,并與jdb進行搭配使用的相關信息,請查看1.4.2文檔。
基本的jdb命令
以下是基本的jdb命令列表。Java調試器支持jdb幫助命令列出的其他命令。
help, or?最重要的jdb命令,用于顯示帶簡要說明的公認的命令列表。run在啟動jdb,并且設置任何必要的斷點之后,你可以使用此命令來啟動待調試的應用程序的執行。只有使用jdb運行待調試的應用程序時(與附加到現有的虛擬機的做法相反),該命令才可用。cont在一個斷點、異常或者步驟之后,繼續待調試的應用程序的執行。print顯示Java對象和原生值。 對于原生類型的變量或字段而言,將會打印實際的值;對于對象而言,將打印一個簡單的描述。請查看下方的dump命令以獲取關于對象的更多信息。
注意: 為了顯示本地變量,包含的類必須使用javac -g 選項進行編譯。
print支持多種包含方法調用的簡單Java表達式,例如:
print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k(i, j, k are primities and either fields or local variables)
print myObj.myMethod()(if myMethod returns a non-null)
print new java.lang.String("Hello").length()
dump對于原生值而言,該命令等同于print。對于對象而言,它會打印對象中每個定義的字段的當前值。靜態字段和實例字段均包含在內。threads
列出當前正在運行的線程,并打印出每個線程的名稱和當前狀態,以及可用于其他命令的索引值。例如:
4.(java.lang.Thread)0x1 main running
在這個示例中,線程的索引為4,該線程是java.lang.Thread的一個實例,線程名稱為"main",該線程正在運行。
thread選擇一個線程作為當前線程。許多jdb命令都是基于當前線程的設置。該線程可以用上面threads命令中描述的索引值來指定。where不帶參數的where將輸出當前線程的堆棧信息。where all將輸出當前線程組中所有線程的堆棧信息。wherethreadindex將輸出指定索引的線程的堆棧信息。
如果當前線程被掛起(通過諸如一個斷點的事件或掛起命令來實現),使用print和dump變量將打印本地變量和字段。向上向下命令可以選擇當前的棧幀。
斷點
在jdb中,我們可以在指定行號或方法的第一個指令處設置斷點,例如:
stop at MyClass:22(在MyClass第22行源代碼的第一個指令處設置一個斷點)
stop in java.lang.String.length(在java.lang.String.length方法的開始位置設置一個斷點)
stop in MyClass.<init>(<init>標識MyClass的構造函數)
stop in MyClass.<clinit>(<clinit>標識MyClass的靜態初始化代碼)
如果一個方法被重載,你也必須指定它的參數類型,以便于斷點能夠選擇適當的方法。例如:MyClass.myMethod(int,java.lang.String),或者MyClass.myMethod()。
我們可以使用語法類似于clearMyClass:45的clear命令來刪除斷點。使用不帶參數的clear命令可以顯示當前設置的所有斷點列表。使用cont命令可以繼續向下執行。
步進
step命令用于向前執行到當前棧幀或被被調用方法的下一行,next命令用于向前執行到當前棧幀的下一行。
異常
如果發生了一個沒有被catch語句捕獲的異常,虛擬機通常會打印該異常的追蹤信息并退出程序。當運行于jdb之下時,無論如何,拋出的異常都會被控制返回到jdb上,然后,你可以使用jdb來診斷異常的原因。
使用catch命令讓待調試的應用程序在其他拋出異常的位置暫停,例如:catch java.io.FileNotFoundException或catch mypackage.BigTroubleException。指定類(或子類)實例的任何異常都將在異常的拋出位置暫停應用程序。
ignore命令用于取消上一個catch命令的作用效果。
注意:ignore命令不會導致待調試的虛擬機忽略指定的異常,而是僅作用于調試器。
命令行選項
當你使用在命令行中使用jdb時,jdb接受大多數與java命令相同的選項參數,包括-D,-classpath,和-X<option>等。
jdb接受如下額外選項:
-help顯示幫助信息。-sourcepath<dir1:dir2:...>指定源代碼文件的搜索路徑。如果此選項未指定,則默認為"."。-attach<address>使用默認的連接機制,將調試器附加到之前運行的虛擬機上。-listen<address>使用標準器連接器在指定的地址等待正在運行的虛擬機進行連接。-listenany使用標準連接器在任何可用的地址等待正在運行的虛擬機進行連接。-launch當啟動jdb時,立即啟動待調試的應用程序。此選項不需要使用運行命令。待調試的應用程序將會運行,然后在加載初始化應用類之前暫停。此時,你可以設置任何必要的斷點,然后使用cont來繼續執行。-listconnectors列出在此虛擬機上可用的連接器。-connect<connector-name>:<name1>=<value1>,...使用命名的連接器和列出的參數值連接目標虛擬機。-dbgtrace [flags]打印正在調試的jdb的相關信息。-tclient以Java HotSpot虛擬機(客戶端)模式運行應用程序。-tserver以Java HotSpot虛擬機(服務器)模式運行應用程序。-Joption傳遞選項參數給Java虛擬機,并用于運行jdb。(Java虛擬機程序的選項參數使用運行命令來傳遞。) 例如,-J-Xms48m設置啟動內存為48MB。
其他選項支持連接調試器的替代機制和虛擬機調試。Java平臺調試器體系結構提供了關于連接方案的附加文檔。
轉發到被調試的進程的選項參數
-v -verbose[:class|gc|jni]啟用冗余模式。-D<name>=<value>設置系統屬性。-classpath<directories separated by ":">列出用于查找類的目錄。-X<option>非標準的目標虛擬機選項。
總結
- 上一篇: Immutable(不可变)集合
- 下一篇: 由浅入深讲解数据库中Synonym的使用