🚀 在 VS Code 中免費取得

執行與偵錯 Java

Visual Studio Code 可讓您透過 Java 偵錯工具擴充功能來偵錯 Java 應用程式。這是一款輕量型 Java 偵錯工具,以 Java Debug Server 為基礎,可擴充 Red Hat 提供的 Java™ 語言支援

以下是支援的偵錯功能清單

  • 啟動/附加
  • 中斷點
  • 例外狀況
  • 暫停 & 繼續
  • 逐步進入/跳出/跳過
  • 變數
  • 呼叫堆疊
  • 執行緒
  • 偵錯主控台
  • 評估
  • 熱碼取代

Java 偵錯工具是一個開放原始碼專案,歡迎貢獻者透過 GitHub 存放庫協作

如果您在使用下列功能時遇到任何問題,可以提出 issue 與我們聯絡。

安裝

若要在 Visual Studio Code 中取得完整的 Java 語言支援,您可以安裝 Extension Pack for Java,其中包含 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 偵錯工作階段設定全域主控台。

中斷點

Java 偵錯工具支援各種中斷點,例如行中斷點、條件中斷點、資料中斷點和記錄點。

中斷點 - 條件中斷點

在運算式評估的協助下,偵錯工具也支援條件中斷點。您可以設定中斷點,使其在運算式評估為 true 時中斷。

中斷點 - 資料中斷點

您可以讓偵錯工具在變數變更其值時中斷。請注意,資料中斷點只能在偵錯工作階段內設定。這表示您需要啟動您的應用程式並先在一般中斷點上中斷。然後,您可以選取變數檢視中的欄位並設定資料中斷點。

Data Breakpoint

中斷點 - 記錄點

記錄點也受到 Java 偵錯工具的支援。記錄點可讓您將輸出傳送至偵錯主控台,而無需編輯程式碼。它們與中斷點不同,因為它們不會停止應用程式的執行流程。

中斷點 - 觸發的中斷點

觸發的中斷點是一種中斷點,一旦另一個中斷點被命中,它就會自動啟用。當診斷僅在特定先決條件之後才會發生的程式碼中的失敗案例時,它們可能非常有用。

可以透過在字形邊界上按一下滑鼠右鍵、選取新增觸發的中斷點,然後選擇哪個其他中斷點啟用該中斷點來設定觸發的中斷點。

運算式評估

偵錯工具也允許您在 監看式 視窗以及偵錯主控台中評估運算式。

熱碼取代

偵錯工具支援的另一個進階功能是「熱碼」取代。熱碼取代 (HCR) 是一種偵錯技術,Java 偵錯工具藉此透過偵錯通道將類別變更傳輸到另一個 Java 虛擬機器 (JVM)。HCR 有助於實驗性開發,並促進反覆試驗的編碼。使用這項新功能,您可以啟動偵錯工作階段並在您的開發環境中變更 Java 檔案,偵錯工具會取代執行中 JVM 中的程式碼。不需要重新啟動,這就是它被稱為「熱」的原因。以下說明如何在 VS Code 中搭配 Java 偵錯工具使用 HCR。

您可以使用偵錯設定 java.debug.settings.hotCodeReplace 來控制如何觸發熱碼取代。可能的設定值為

  • manual - 按一下工具列以套用變更 (預設)。
  • auto - 在編譯後自動套用變更。
  • never - 停用熱碼取代。

逐步篩選

擴充功能支援逐步篩選,以篩選掉您在偵錯時不想看到或逐步執行的類型。透過此功能,您可以設定要在 launch.json 中篩選的套件,以便在您逐步執行時可以略過它們。

組態選項

有許多選項和設定可用於設定偵錯工具。例如,使用啟動選項可以輕鬆完成設定 JVM 引數和環境變數。

請參閱 Red Hat 提供的 Java™ 語言支援擴充功能的文件,以取得有關設定專案的協助。

對於許多常用的設定,VS Code Java 偵錯工具組態中提供了範例。文件說明 Java 偵錯工具如何自動為您產生組態,以及如果您需要修改它們,如何使用主要類別、不同引數、環境、附加至其他 Java 處理序以及使用更多進階功能來執行此操作。

以下是適用於 LaunchAttach 的所有可用組態。如需有關如何撰寫 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 - 使用處理序選取器來選取要附加的處理序,或將處理序識別碼作為整數。
    • ${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

  • Java 測試 - 使用 Java Test Runner 擴充功能在 VS Code 內測試 Java。
  • Java 擴充功能 - 瞭解更多適用於 VS Code 的實用 Java 擴充功能。