執行與偵錯 Java
Visual Studio Code 可讓您透過 Java 偵錯工具 擴充功能來偵錯 Java 應用程式。這是一個輕量型的 Java 偵錯工具,以 Java Debug Server 為基礎,擴充了 Red Hat 的 Java™ 語言支援。
以下是支援的偵錯功能清單
- 啟動/附加
- 中斷點
- 例外狀況
- 暫停 & 繼續
- 逐步進入/跳出/跳過
- 變數
- 呼叫堆疊
- 執行緒
- 偵錯主控台
- 評估
- 熱碼取代
Java 偵錯工具是一個開放原始碼專案,歡迎貢獻者透過 GitHub 存放庫進行協作
如果您在使用以下功能時遇到任何問題,可以提出 問題 來聯絡我們。
安裝
若要在 Visual Studio Code 中取得完整的 Java 語言支援,您可以安裝 Java 擴充功能套件,其中包含 Java 偵錯工具擴充功能。
如需開始使用擴充功能套件的詳細資訊,您可以檢閱Java 入門教學課程。
設定
預設情況下,偵錯工具會自動尋找主要類別並在記憶體中產生預設啟動組態,以立即執行您的應用程式。
如果您想要自訂並保存您的啟動組態,您可以選取 [執行與偵錯] 檢視中的 [建立 launch.json 檔案] 連結。
launch.json
檔案位於工作區 (專案根資料夾) 的 .vscode
資料夾中。
如需如何建立 launch.json
的詳細資訊,請閱讀啟動組態;如需 Java 組態選項的詳細資訊,您可以閱讀組態選項。
執行與偵錯
偵錯工具擴充功能提供多種方式來執行和偵錯您的 Java 應用程式。
從 CodeLens 執行
您會在 main()
函式的 CodeLens 上找到 [執行|偵錯]。
從編輯器功能表執行
啟動偵錯的另一種方式是從頂端編輯器標題列選取 [執行 Java] 或 [偵錯 Java] 功能表。
按下 F5 執行
按下 F5,偵錯工具會自動尋找您專案的進入點並開始偵錯。您也可以從 VS Code 側邊欄的 [執行與偵錯] 檢視開始偵錯工作階段。如需詳細資訊,請參閱在 VS Code 中偵錯。
偵錯單一檔案
除了支援偵錯由建置工具管理的 Java 專案之外,VS Code 也支援偵錯沒有任何專案的單一 Java 檔案。
偵錯工作階段輸入
VS Code 中的預設偵錯主控台不支援輸入。如果您的程式需要終端機的輸入,您可以使用 VS Code 內的整合式終端機 (⌃` (Windows、Linux Ctrl+`)) 或外部終端機來啟動它。您也可以使用使用者設定 java.debug.settings.console
為所有 Java 偵錯工作階段設定全域主控台。
中斷點
Java 偵錯工具支援各種中斷點,例如行中斷點、條件中斷點、資料中斷點和記錄點。
中斷點 - 條件中斷點
在運算式評估的協助下,偵錯工具也支援條件中斷點。您可以設定中斷點,使其在運算式評估為 true 時中斷。
中斷點 - 資料中斷點
您可以讓偵錯工具在變數變更其值時中斷。請注意,資料中斷點只能在偵錯工作階段內設定。這表示您需要啟動您的應用程式,並先在一般中斷點上中斷。然後,您可以選取 [變數] 檢視中的欄位並設定資料中斷點。
中斷點 - 記錄點
記錄點也受到 Java 偵錯工具的支援。記錄點可讓您將輸出傳送至偵錯主控台,而無需編輯程式碼。它們與中斷點不同,因為它們不會停止應用程式的執行流程。
中斷點 - 觸發的中斷點
觸發的中斷點是在另一個中斷點被擊中後自動啟用的中斷點。當診斷僅在特定先決條件之後才會發生的程式碼中的失敗案例時,它們可能非常有用。
可以透過在字形邊界上按一下滑鼠右鍵、選取 [新增觸發的中斷點],然後選擇哪個其他中斷點啟用該中斷點來設定觸發的中斷點。
運算式評估
偵錯工具也允許您評估 [監看式] 視窗以及偵錯主控台中的運算式。
熱碼取代
偵錯工具支援的另一個進階功能是「熱碼」取代。熱碼取代 (HCR) 是一種偵錯技術,Java 偵錯工具藉此技術透過偵錯通道將類別變更傳輸到另一個 Java 虛擬機器 (JVM)。HCR 有助於實驗性開發,並促進反覆試驗的編碼。有了這項新功能,您可以啟動偵錯工作階段並在您的開發環境中變更 Java 檔案,偵錯工具將會取代執行中 JVM 中的程式碼。不需要重新啟動,這就是為什麼它被稱為「熱」。以下是如何在 VS Code 中將 HCR 與 Java 偵錯工具搭配使用的說明。
您可以使用偵錯設定 java.debug.settings.hotCodeReplace
來控制如何觸發熱碼取代。可能的設定值為
manual
- 按一下工具列以套用變更 (預設)。auto
- 在編譯後自動套用變更。never
- 停用熱碼取代。
逐步篩選
擴充功能支援逐步篩選,以篩選掉您在偵錯時不想看到或逐步執行的類型。透過此功能,您可以設定要在 launch.json
中篩選的套件,以便在您逐步執行時可以略過它們。
組態選項
有許多選項和設定可用於設定偵錯工具。例如,使用啟動選項可以輕鬆完成設定 JVM 引數和環境變數。
請參閱 Red Hat 的 Java™ 語言支援 擴充功能的文件,以取得設定專案的協助。
對於許多常用的設定,VS Code Java 偵錯工具組態中提供了範例。該文件說明 Java 偵錯工具如何自動為您產生組態,以及如果您需要修改它們,如何使用主要類別、不同的引數、環境、附加到其他 Java 處理序,以及更進階功能的使用方式來執行此操作。
以下是適用於 [啟動] 和 [附加] 的所有可用組態。如需有關如何撰寫 launch.json
檔案的詳細資訊,請參閱偵錯。
啟動
mainClass
(必要) - 程式進入點的完整類別名稱 (例如 [java 模組名稱/]com.xyz.MainApp) 或 java 檔案路徑。args
- 傳遞至程式的命令列引數。使用"${command:SpecifyProgramArgs}"
來提示輸入程式引數。它接受字串或字串陣列。sourcePaths
- 程式的額外原始檔目錄。偵錯工具預設會從專案設定中尋找原始程式碼。此選項允許偵錯工具在額外目錄中尋找原始程式碼。modulePaths
- 用於啟動 JVM 的模組路徑。如果未指定,偵錯工具將自動從目前專案解析。$Auto
- 自動解析目前專案的模組路徑。$Runtime
- 目前專案「執行階段」範圍內的模組路徑。$Test
- 目前專案「測試」範圍內的模組路徑。!/path/to/exclude
- 從模組路徑中排除指定的路徑。/path/to/append
- 將指定的路徑附加到模組路徑。
classPaths
- 用於啟動 JVM 的類別路徑。如果未指定,偵錯工具將自動從目前專案解析。$Auto
- 自動解析目前專案的類別路徑。$Runtime
- 目前專案「執行階段」範圍內的類別路徑。$Test
- 目前專案「測試」範圍內的類別路徑。!/path/to/exclude
- 從類別路徑中排除指定的路徑。/path/to/append
- 將指定的路徑附加到類別路徑。
encoding
- JVM 的file.encoding
設定。如果未指定,將使用 'UTF-8'。可能的值可以在支援的編碼中找到。vmArgs
- JVM 的額外選項和系統屬性 (例如 -Xms<size> -Xmx<size> -D<name>=<value>),它接受字串或字串陣列。projectName
- 偵錯工具在其中搜尋類別的慣用專案。不同的專案中可能會有重複的類別名稱。當偵錯工具在啟動程式時尋找指定的主要類別時,此設定也有效。當工作區有多個 Java 專案時,這是必要的,否則運算式評估和條件中斷點可能無法運作。cwd
- 程式的工作目錄。預設為${workspaceFolder}
。env
- 程式的額外環境變數。envFile
- 包含環境變數定義的檔案絕對路徑。stopOnEntry
- 在啟動後自動暫停程式。console
- 用於啟動程式的指定主控台。如果未指定,則使用java.debug.settings.console
使用者設定指定的主控台。internalConsole
- VS Code 偵錯主控台 (不支援輸入串流)。integratedTerminal
- VS Code 整合式終端機。externalTerminal
- 可以在使用者設定中設定的外部終端機。
shortenCommandLine
- 當專案具有長類別路徑或大型 VM 引數時,用於啟動程式的命令列可能會超過作業系統允許的最大命令列字串限制。此組態項目提供多種方法來縮短命令列。預設為auto
。none
- 使用標準命令列 'java {options} classname {args}' 啟動程式。jarmanifest
- 將類別路徑參數產生到暫時的 classpath.jar 檔案,並使用命令列 'java -cp classpath.jar classname {args}' 啟動程式。argfile
- 將類別路徑參數產生到暫時的引數檔案,並使用命令列 'java @argfile {args}' 啟動程式。此值僅適用於 Java 9 和更高版本。auto
- 自動偵測命令列長度,並判斷是否透過適當的方法縮短命令列。
stepFilters
- 在逐步執行時略過指定的類別或方法。classNameFilters
- [已淘汰 - 由skipClasses
取代] 在逐步執行時略過指定的類別。類別名稱應為完整名稱。支援萬用字元。skipClasses
- 在逐步執行時略過指定的類別。您可以使用內建變數,例如 '$JDK' 和 '$Libraries' 來略過一組類別,或新增特定的類別名稱運算式,例如java.*
、*.Foo
。skipSynthetics
- 在逐步執行時略過合成方法。skipStaticInitializers
- 在逐步執行時略過靜態初始設定式方法。skipConstructors
- 在逐步執行時略過建構函式方法。
附加
hostName
(必要) - 遠端偵錯目標的主機名稱或 IP 位址。port
(必要) - 遠端偵錯目標的偵錯連接埠。processId
- 使用處理序選取器來選取要附加的處理序,或將處理序 ID 作為整數。${command:PickJavaProcess}
- 使用處理序選取器來選取要附加的處理序。- 整數 PID - 附加至指定的本機處理序。
timeout
- 重新連線前的逾時值,以毫秒為單位 (預設為 30000 毫秒)。sourcePaths
- 程式的額外原始檔目錄。偵錯工具預設會從專案設定中尋找原始程式碼。此選項允許偵錯工具在額外目錄中尋找原始程式碼。projectName
- 偵錯工具在其中搜尋類別的慣用專案。不同的專案中可能會有重複的類別名稱。當工作區有多個 Java 專案時,這是必要的,否則運算式評估和條件中斷點可能無法運作。stepFilters
- 在逐步執行時略過指定的類別或方法。classNameFilters
- [已淘汰 - 由skipClasses
取代] 在逐步執行時略過指定的類別。類別名稱應為完整名稱。支援萬用字元。skipClasses
- 在逐步執行時略過指定的類別。您可以使用內建變數,例如 '$JDK' 和 '$Libraries' 來略過一組類別,或新增特定的類別名稱運算式,例如java.*
、*.Foo
。skipSynthetics
- 在逐步執行時略過合成方法。skipStaticInitializers
- 在逐步執行時略過靜態初始設定式方法。skipConstructors
- 在逐步執行時略過建構函式方法。
使用者設定
java.debug.logLevel
:傳送至 VS Code 的偵錯工具記錄檔的最低層級,預設為warn
。java.debug.settings.showHex
:在 [變數] 中以十六進位格式顯示數字,預設為false
。java.debug.settings.showStaticVariables
:在 [變數] 中顯示靜態變數,預設為false
。java.debug.settings.showQualifiedNames
:在 [變數] 中顯示完整類別名稱,預設為false
。java.debug.settings.showLogicalStructure
:在 [變數] 中顯示 Collection 和 Map 類別的邏輯結構,預設為true
。java.debug.settings.showToString
:在 [變數] 中顯示覆寫 'toString' 方法的所有類別的 'toString()' 值,預設為true
。java.debug.settings.maxStringLength
:[變數] 或 [偵錯主控台] 中顯示的字串最大長度。超過此限制的字串將會被截斷。預設值為0
,表示不執行截斷。java.debug.settings.hotCodeReplace
:在偵錯期間重新載入已變更的 Java 類別,預設為manual
。請確定 Java 語言支援擴充功能未停用java.autobuild.enabled
。請參閱 熱碼取代 Wiki 頁面,以取得有關使用方式和限制的詳細資訊。- manual - 按一下工具列以套用變更。
- auto - 在編譯後自動套用變更。
- never - 永不套用變更。
java.debug.settings.enableHotCodeReplace
:為 Java 程式碼啟用熱碼取代。請確定 VS Code Java 未停用自動建置。請參閱 熱碼取代 Wiki 頁面,以取得有關使用方式和限制的詳細資訊。java.debug.settings.enableRunDebugCodeLens
:為主進入點上方的執行和偵錯按鈕啟用 CodeLens 提供者,預設為true
。java.debug.settings.forceBuildBeforeLaunch
:在啟動 Java 程式之前強制建置工作區,預設為true
。java.debug.settings.console
:用於啟動 Java 程式的指定主控台,預設為integratedTerminal
。如果您想要自訂特定偵錯工作階段的主控台,請修改launch.json
中的console
組態。internalConsole
- VS Code 偵錯主控台 (不支援輸入串流)。integratedTerminal
- VS Code 整合式終端機。externalTerminal
- 可以在使用者設定中設定的外部終端機。
java.debug.settings.exceptionBreakpoint.skipClasses
:在例外狀況中斷時略過指定的類別。您可以使用內建變數,例如 '$JDK' 和 '$Libraries' 來略過一組類別,或新增特定的類別名稱運算式,例如java.*
、*.Foo
。java.debug.settings.stepping.skipClasses
:在逐步執行時略過指定的類別。您可以使用內建變數,例如 '$JDK' 和 '$Libraries' 來略過一組類別,或新增特定的類別名稱運算式,例如java.*
、*.Foo
。java.debug.settings.stepping.skipSynthetics
:在逐步執行時略過合成方法。java.debug.settings.stepping.skipStaticInitializers
:在逐步執行時略過靜態初始設定式方法。java.debug.settings.stepping.skipConstructors
:在逐步執行時略過建構函式方法。java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest
:每個 JDWP 要求中可以要求的變數或欄位數目上限。值越高,在展開變數檢視時,要求偵錯目標的頻率就越低。此外,數值過大可能會導致 JDWP 要求逾時。預設值為 100。java.debug.settings.jdwp.requestTimeout
:偵錯工具與目標 JVM 通訊時的 JDWP 要求逾時 (毫秒)。預設值為 3000。java.debug.settings.vmArgs
:用於啟動 Java 程式的預設 VM 引數。例如,使用 '-Xmx1G -ea' 將堆積大小增加到 1 GB 並啟用判言。如果您想要自訂特定偵錯工作階段的 VM 引數,您可以修改launch.json
中的 'vmArgs' 組態。java.silentNotification
:控制是否可以使用通知來報告進度。如果為 true,則改用狀態列來報告進度。預設值為false
。
疑難排解
如果您在使用偵錯工具時遇到問題,可以在 vscode-java-debug GitHub 存放庫中找到詳細的疑難排解指南。
已說明常見問題,包括
- Java 語言支援擴充功能無法啟動。
- 建置失敗,是否要繼續?
- *.java 不在類別路徑上。僅會報告語法錯誤。
- 程式錯誤:找不到或載入主要類別 X。
- 程式擲回 ClassNotFoundException。
- 無法完成熱碼取代。
- 請在 launch.json 中指定遠端偵錯目標的主機名稱和連接埠。
- 無法評估。原因:執行緒已繼續,因此無法評估。
- 找不到具有 main 方法的類別。
- 啟動偵錯工具時,沒有 vscode.java.startDebugSession 的 delegateCommandHandler。
- 無法解析類別路徑。
- 不支援要求類型 "X"。僅支援 "launch" 和 "attach"。
意見反應與問題
您可以在 vscode-java-debug 存放庫中找到完整的問題清單。您可以提交 錯誤或功能建議,並參與社群驅動的 vscode-java-debug Gitter 頻道。
後續步驟
繼續閱讀以瞭解
- 偵錯 - 瞭解如何在 VS Code 中搭配任何語言的專案使用偵錯工具。
以及 Java