執行和除錯 Java
Visual Studio Code 透過 Debugger for Java 擴充套件支援除錯 Java 應用程式。它是一個輕量級的 Java 偵錯程式,基於 Java Debug Server,後者擴充套件了 Language Support for Java™ by Red Hat。
支援的除錯功能列表
- 啟動/附加
- Breakpoints
- 異常
- 暫停與繼續
- 步入/步出/跨步
- 變數
- 呼叫堆疊
- 執行緒
- 除錯控制檯
- 評估
- 熱程式碼替換
Java 偵錯程式是一個開源專案,歡迎貢獻者透過 GitHub 倉庫進行協作。
如果您在使用以下功能時遇到任何問題,可以透過提交問題聯絡我們。
安裝
要在 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 除錯會話配置全域性控制檯。
Breakpoints
Debugger for Java 支援各種斷點,例如行斷點、條件斷點、資料斷點和日誌點。
斷點 - 條件斷點
藉助表示式計算,偵錯程式還支援條件斷點。您可以設定斷點,使其在表示式計算為 true 時中斷。
斷點 - 資料斷點
您可以在變數值更改時讓偵錯程式中斷。請注意,資料斷點只能在除錯會話內部設定。這意味著您需要先啟動應用程式並在常規斷點處中斷。然後,您可以在“變數”檢視中選擇一個欄位並設定資料斷點。

斷點 - 日誌點
Java 偵錯程式也支援 日誌點。日誌點允許您在不修改程式碼的情況下將輸出傳送到除錯控制檯。它們與斷點不同,因為它們不會停止應用程式的執行流程。
斷點 - 觸發斷點
觸發斷點是一種在另一個斷點命中後自動啟用的斷點。當代碼中出現僅在特定先決條件發生後才出現的故障情況時,它們非常有用。
可以透過右鍵單擊字形邊距,選擇 新增觸發斷點,然後選擇哪個其他斷點啟用此斷點來設定觸發斷點。
Expression evaluation
偵錯程式還允許您在“監視”視窗和除錯控制檯中評估表示式。
熱程式碼替換
偵錯程式支援的另一項高階功能是“熱程式碼”替換。熱程式碼替換 (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.json 檔案的更多資訊,請參閱 除錯。
啟動
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(整數)。${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:在“變數”檢視中顯示集合類和 Map 類的邏輯結構,預設為true。java.debug.settings.showToString:在“變數”檢視中顯示重寫了toString方法的所有類的“toString()”值,預設為true。java.debug.settings.maxStringLength:在“變數”檢視或“除錯控制檯”中顯示的字串的最大長度。超過此限制的字串將被截斷。預設值為0,表示不進行截斷。java.debug.settings.hotCodeReplace:在除錯期間重新載入更改的 Java 類,預設為manual。請確保 Java Language Support 擴充套件 的java.autobuild.enabled未被停用。有關使用方法和限制的更多資訊,請參閱 Hot Code Replace wiki 頁面。manual- 單擊工具欄以應用更改。auto- 編譯後自動應用更改。never- 永不應用更改。
java.debug.settings.enableHotCodeReplace:為 Java 程式碼啟用熱程式碼替換。請確保 VS Code Java 的自動構建未被停用。有關使用方法和限制的更多資訊,請參閱 Hot Code Replace 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 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