日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

JDB调试

發布時間:2023/12/31 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 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.FileNotFoundExceptioncatch 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.FileNotFoundExceptioncatch 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调试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。