Java調試體系

Java調試體系,就是虛擬機的一整套用於調試的工具和接口。通過JDPA提供的API,開發人員可以方便靈活的搭建Java調試工具。

JPDA組成模塊

  1. JVMTI(Java虛擬機工具接口)
  2. JDWP(Java調試線協議)
  3. JDI(Java調試接口)

JVMTI

JVMTI定義了虛擬機應該提供的調試服務,包括調試信息(Information譬如棧信息)、調試行爲(Action譬如客戶端設置一個斷點)和通知(Notification譬如到達某個斷點時通知客戶端),該接口由虛擬機實現者提供實現,並結合在虛擬機中 。

JDWP

Java調試線協議,是一個爲Java調試而制定的通訊交互協議,它定義了調試器和被調試程序之間傳遞信息的格式。JDWP詳細完整地定義了請求命令、響應數據和錯誤代碼,保證了調試器和被調試程序間JVMTI和JDI的通信通暢。 需要注意的是,JDWP本身並不包括傳輸層的實現,JDWP只包括了和傳輸層交互的定義。

JDI

Java調試接口,是三個模塊中最高層的接口,由Java語言實現。 JDI爲開發人員提供了若干接口,不僅能格式化JDWP數據,而且還能爲JDWP數據傳輸提供隊列、緩存等優化服務。通過它,開發人員就能遠程操控後端虛擬機上被調試程序的運行。我們一般的調試器也都是通過JDI接口構造出一套界面化的工具,達到易用的目的。

在這裏插入圖片描述# JPDA如何運行?
JPDA的調試過程有幾個重要的概念:調試者、被調試者、通信器。具體如下:

  1. 被調試者 運行於我們想調試的Java虛擬機之上,它可以通過JVMTI這個標準接口,監控當前虛擬機的信息。
  2. 調試者 定義了用戶可使用的調試接口,通過這些接口,用戶可以對被調試虛擬機發送調試命令,同時調試者接受並顯示調試結果。
  3. 通信器 將調試者與被調試者之間的調試命令和調試結果,封裝成JDWP協議的包進行傳輸的。

JDB調試-本地調試

本文不針對開發工具,如IDEA、MyElipse等,遠程調試做解釋

JDB是基於文本和命令行的調試工具。
在這裏插入圖片描述(1)修改java啓動腳本,把遠程調試端口打開
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
(2)程序運行起來
(3)attach jdb到程序上,在程序所在機器上運行 下面的腳本
$JAVA_HOME/bin/jdb -attach 127.0.0.1:8000
(4)指定斷點,運行

JDB調試-常用命令

run [類 [參數]] - 開始執行應用程序的主類
stop in <類 ID>.<方法>[(參數類型,…)] - 在方法中設置斷點
stop at <類 ID>:<行> - 在行中設置斷點
locals - 輸出當前堆棧幀中的所有局部變量
clear <類 ID>.<方法>[(參數類型,…)] - 清除方法中的斷點
clear <類 ID>:<行> - 清除行中的斷點
clear - 列出斷點
print <表達式> - 輸出表達式的值
catch [uncaught|caught|all] <類 ID>|<類模式> - 出現指定的異常時中斷
ignore [uncaught|caught|all] <類 ID>|<類模式> – 對於指定的異常,取消 “catch”
watch [access|all] <類 ID>.<字段名> - 監視對字段的訪問/修改
unwatch [access|all] <類 ID>.<字段名> - 停止監視對字段的訪問/修改
step - 執行當前行
step up - 執行到當前方法返回到其調用程序
stepi - 執行當前指令
next - 跳過一行(跨過調用)
cont - 從斷點處繼續執行
dump –查看對象信息
list [line number|method] - 輸出源代碼
use(或 sourcepath) [源文件路徑] - 顯示或更改源路徑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章