執行與偵錯 Java
Visual Studio Code 允許您透過 Debugger for Java 擴充功能來偵錯 Java 應用程式。這是一個輕量級的 Java 偵錯工具,基於 Java Debug Server,它擴充了 Red Hat 的 Language Support for Java™ by Red Hat。
以下是支援的偵錯功能清單
- 啟動/附加
- 中斷點
- 例外狀況
- 暫停與繼續
- 逐步深入/跳出/跨過
- 變數
- 呼叫堆疊
- 執行緒
- 偵錯主控台
- 評估
- 熱程式碼取代
Java 偵錯工具是一個開放原始碼專案,歡迎貢獻者透過 GitHub 存放庫進行協作
如果您在使用以下功能時遇到任何問題,可以透過提交 issue (問題單) 來與我們聯繫。
安裝
若要在 Visual Studio Code 中取得完整的 Java 語言支援,您可以安裝 Extension Pack for Java,其中包含 Debugger for 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 偵錯工作階段設定全域主控台。
中斷點
Debugger for Java 支援各種中斷點,例如行中斷點、條件中斷點、資料中斷點和記錄點。
中斷點 - 條件中斷點
藉由運算式評估的協助,偵錯工具也支援條件中斷點。您可以設定中斷點,使其在運算式評估結果為 true 時中斷。
中斷點 - 資料中斷點
您可以讓偵錯工具在變數變更其值時中斷。請注意,資料中斷點只能在偵錯工作階段內設定。這表示您需要先啟動應用程式並在一般中斷點上中斷。然後,您可以在 VARIABLES 檢視中挑選一個欄位並設定資料中斷點。

中斷點 - 記錄點
Java 偵錯工具也支援 記錄點。記錄點可讓您將輸出傳送至偵錯主控台,而不需要編輯程式碼。它們與中斷點不同,因為它們不會停止應用程式的執行流程。
中斷點 - 觸發中斷點
觸發的中斷點是在另一個中斷點被觸及後自動啟用的中斷點。在診斷僅在特定前提條件後發生的程式碼失敗案例時,它們非常有用。
可以透過右鍵點選符號邊界,選取 新增觸發的中斷點,然後選擇哪個其他中斷點來啟用該中斷點。
運算式評估
偵錯工具也讓您可以在 WATCH 視窗以及偵錯主控台中評估運算式。
熱程式碼取代
偵錯工具支援的另一項進階功能是「熱程式碼」取代。熱程式碼取代 (HCR) 是一種偵錯技術,透過該技術,Debugger for Java 會透過偵錯通道將類別變更傳輸到另一個 Java 虛擬機器 (JVM)。HCR 有助於實驗性開發,並促進反覆試誤的程式碼編寫。有了這項新功能,您可以啟動偵錯工作階段並在開發環境中變更 Java 檔案,偵錯工具將會取代正在執行的 JVM 中的程式碼。不需要重新啟動,這就是為什麼它被稱為「熱」。以下說明如何在 VS Code 中配合 Debugger for Java 使用 HCR。
您可以使用偵錯設定 java.debug.settings.hotCodeReplace 來控制如何觸發熱程式碼取代。可能的設定值為
manual- 按一下工具列以套用變更(預設)。auto- 編譯後自動套用變更。never- 停用熱程式碼取代。
逐步執行篩選
擴充功能支援逐步執行篩選,以便在偵錯時過濾掉您不想看到或單步執行的型別。透過此功能,您可以在 launch.json 中設定要篩選的套件,以便在逐步執行時略過它們。
設定選項
有許多可用於設定偵錯工具的選項和設定。例如,使用啟動選項即可輕鬆設定 JVM 引數和環境變數。
請參閱 Language Support for Java™ by Red Hat 擴充功能的說明文件,以取得設定專案的協助。
針對許多常用的設定,VS Code Java Debugger Configuration 中提供了範例。該文件說明了 Java 偵錯工具如何為您自動產生設定,以及如果您需要修改它們,如何搭配主類別、不同的引數、環境、附加至其他 Java 行程,以及使用更多進階功能來進行修改。
以下是 Launch 和 Attach 可用的所有設定。如需有關如何撰寫 launch.json 檔案的詳細資訊,請參閱 偵錯。
Launch
mainClass(必要)- 完整限定的類別名稱(例如 [java 模組名稱/]com.xyz.MainApp)或程式進入點的 java 檔案路徑。args- 傳遞給程式的命令列引數。使用"${command:SpecifyProgramArgs}"來提示輸入程式引數。它接受字串或字串陣列。sourcePaths- 程式的額外原始程式碼目錄。偵錯工具預設會從專案設定中尋找原始程式碼。此選項允許偵錯工具在額外的目錄中尋找原始程式碼。modulePaths- 用於啟動 JVM 的模組路徑。如果未指定,偵錯工具將會從目前專案自動解析。$Auto- 自動解析目前專案的模組路徑。$Runtime- 目前專案 'runtime' 範圍內的模組路徑。$Test- 目前專案 'test' 範圍內的模組路徑。!/path/to/exclude- 從模組路徑中排除指定的路徑。/path/to/append- 將指定的路徑附加至模組路徑。
classPaths- 用於啟動 JVM 的類別路徑。如果未指定,偵錯工具將會從目前專案自動解析。$Auto- 自動解析目前專案的類別路徑。$Runtime- 目前專案 'runtime' 範圍內的類別路徑。$Test- 目前專案 '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 (PID)。${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: 在 Variables 中以十六進位格式顯示數字,預設為false。java.debug.settings.showStaticVariables: 在 Variables 中顯示靜態變數,預設為false。java.debug.settings.showQualifiedNames: 在 Variables 中顯示完整限定的類別名稱,預設為false。java.debug.settings.showLogicalStructure: 在 Variables 中顯示 Collection 和 Map 類別的邏輯結構,預設為true。java.debug.settings.showToString: 在 Variables 中為所有覆寫 'toString' 方法的類別顯示 'toString()' 值,預設為true。java.debug.settings.maxStringLength: 在 Variables 或 Debug Console 中顯示的字串最大長度。超過此限制的字串將被修剪。預設為0,表示不進行修剪。java.debug.settings.hotCodeReplace: 在偵錯期間重新載入已變更的 Java 類別,預設為manual。請確定沒有為 Java Language Support 擴充功能停用java.autobuild.enabled。如需有關使用方式和限制的詳細資訊,請參閱 Hot Code Replace 維基頁面。- manual - 按一下工具列以套用變更。
- auto - 編譯後自動套用變更。
- never - 絕不套用變更。
java.debug.settings.enableHotCodeReplace: 為 Java 程式碼啟用熱程式碼取代。請確定沒有為 VS Code Java 停用自動建置。如需有關使用方式和限制的詳細資訊,請參閱 Hot Code Replace 維基頁面。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 Language Support 擴充功能無法啟動。
- 建置失敗,您要繼續嗎?
- *.java 不在類別路徑上。將只會回報語法錯誤。
- 程式錯誤:找不到或載入主類別 X。
- 程式擲回 ClassNotFoundException。
- 無法完成熱程式碼取代。
- 請在 launch.json 中指定遠端被偵錯目標的主機名稱和連接埠。
- 無法評估。原因:無法評估,因為執行緒已恢復。
- 找不到包含 main 方法的類別。
- 啟動偵錯工具時沒有 vscode.java.startDebugSession 的 delegateCommandHandler。
- 無法解析類別路徑。
- 不支援要求類型 "X"。僅支援 "launch" 和 "attach"。
回饋與問題
您可以在 vscode-java-debug 存放庫中找到完整的問題清單。您可以提交 錯誤或功能建議,並參與社群導向的 vscode-java-debug Gitter 頻道。
後續步驟
繼續閱讀以了解
- 偵錯 - 了解如何在 VS Code 中針對任何語言的專案使用偵錯工具。
而針對 Java