參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

執行和除錯 Java

Visual Studio Code 允許你透過 Debugger for Java 擴充套件來除錯 Java 應用程式。它是一個基於 Java Debug Server 的輕量級 Java 偵錯程式,擴充套件了 Language Support for Java™ by Red Hat

以下是支援的除錯功能列表

  • 啟動/附加
  • Breakpoints
  • 異常
  • 暫停與繼續
  • 單步進入/跳出/跳過
  • 變數
  • 呼叫堆疊
  • 執行緒
  • 除錯控制檯
  • 評估
  • 熱程式碼替換

Java 偵錯程式是一個開源專案,歡迎貢獻者透過 GitHub 倉庫進行協作

如果您在使用以下功能時遇到任何問題,可以透過提交問題聯絡我們。

安裝

要在 Visual Studio Code 中獲得完整的 Java 語言支援,你可以安裝 Extension Pack for Java,其中包含了 Debugger for Java 擴充套件。

安裝 Extension Pack for Java

有關如何開始使用該擴充套件包的詳細資訊,你可以查閱 Java 入門教程。

配置

預設情況下,偵錯程式將透過自動查詢主類並在記憶體中生成預設的啟動配置來開箱即用地執行你的應用程式。

如果你想自定義並持久化你的啟動配置,你可以在執行和除錯檢視中選擇建立 launch.json 檔案連結。

Debug Menu

launch.json 檔案位於你工作區(專案根資料夾)的 .vscode 資料夾中。

有關如何建立 launch.json 的更多詳細資訊,請閱讀啟動配置;有關 Java 配置選項的更多詳細資訊,可以閱讀配置選項

執行和除錯

偵錯程式擴充套件提供了多種方式來執行和除錯你的 Java 應用程式。

從 CodeLens 執行

你會在 main() 函式的 CodeLens 上找到執行|除錯

CodeLens

從編輯器選單執行

另一種啟動除錯的方式是從頂部編輯器標題欄中選擇執行 Java除錯 Java 選單。

EditorMenu

按 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 時中斷。

斷點 - 資料斷點

你可以讓偵錯程式在變數值改變時中斷。請注意,資料斷點只能在除錯會話內部設定。這意味著你需要先啟動你的應用程式並在一個常規斷點上中斷。然後你可以在變數檢視中選擇一個欄位並設定資料斷點。

Data Breakpoint

斷點 - 日誌點

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 偵錯程式配置中提供了示例。該文件解釋了 Java 偵錯程式如何自動為你生成配置,以及如果你需要修改它們,如何透過主類、不同的引數、環境、附加到其他 Java 程序以及使用更高階的功能來做到這一點。

以下是所有可用於 LaunchAttach 的配置。有關如何編寫 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:在變數中顯示 Collection 和 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 未被停用。有關用法和限制的更多資訊,請參閱 熱程式碼替換維基頁面
    • manual - 點選工具欄以應用更改。
    • auto - 編譯後自動應用更改。
    • never - 從不應用更改。
  • java.debug.settings.enableHotCodeReplace:為 Java 程式碼啟用熱程式碼替換。請確保 VS Code Java 的自動構建未被停用。有關用法和限制的更多資訊,請參閱 熱程式碼替換維基頁面
  • 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 的委託命令處理程式。
  • 解析類路徑失敗。
  • 不支援請求型別“X”。僅支援“launch”和“attach”。

反饋和問題

你可以在 vscode-java-debug 倉庫中找到完整的問題列表。你可以提交錯誤或功能建議,並參與社群驅動的 vscode-java-debug Gitter 頻道

後續步驟

繼續閱讀以瞭解:

  • 除錯 - 瞭解如何在 VS Code 中為任何語言的專案使用偵錯程式。

以及關於 Java

  • Java 測試 - 使用 Java Test Runner 擴充套件在 VS Code 中測試 Java。
  • Java 擴充套件 - 瞭解更多適用於 VS Code 的有用 Java 擴充套件。