執行與偵錯 Java

Visual Studio Code 允許您透過 Debugger for Java 延伸模組對 Java 應用程式進行偵錯。這是一個輕量級的 Java 偵錯器,基於 Java Debug Server,並擴充了 Language Support for Java™ by Red Hat

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

  • 啟動/附加 (Launch/Attach)
  • 中斷點
  • 例外狀況 (Exceptions)
  • 暫停與繼續 (Pause & Continue)
  • 逐步進入/跳出/跨過 (Step In/Out/Over)
  • 變數
  • 呼叫堆疊 (Call Stacks)
  • 執行緒 (Threads)
  • 偵錯主控台 (Debug Console)
  • 評估
  • Hot Code Replace (熱程式碼替換)

Java 偵錯器是一個開放原始碼專案,歡迎貢獻者透過 GitHub 儲存庫進行協作。

如果您在使用以下功能時遇到任何問題,可以透過提交 issue (問題單) 來與我們聯繫。

安裝

若要在 Visual Studio Code 中獲得完整的 Java 語言支援,您可以安裝 Extension Pack for Java,其中已包含 Debugger for Java 延伸模組。

安裝 Extension Pack for Java

有關如何開始使用該延伸模組套件的詳細資訊,您可以參閱 Java 入門 (Getting Started with Java) 教學課程。

設定

預設情況下,偵錯器會透過自動尋找主類別 (Main class) 並在記憶體中產生預設啟動設定,讓您可以直接開箱即用來啟動應用程式。

如果您想要自訂並永久儲存啟動設定,可以在 **[執行與偵錯] (Run and Debug)** 檢視中選取 **[create a launch.json file]** 連結。

Debug Menu

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

如需有關如何建立 launch.json 的詳細資訊,請閱讀 啟動設定 (Launch configurations);若要進一步了解 Java 的設定選項,您可以閱讀 設定選項 (Configuration options)

執行與偵錯

偵錯器延伸模組提供了多種執行與偵錯 Java 應用程式的方法。

從 CodeLens 執行

您可以在 main() 函式的 CodeLens 上找到 **[Run|Debug]**。

CodeLens

從編輯器選單執行

開始偵錯的另一種方法是從頂端編輯器標題列選取 **[Run Java]** 或 **[Debug Java]** 選單。

EditorMenu

透過按 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 支援各種中斷點,例如行中斷點、條件式中斷點、資料中斷點和記錄點 (Logpoints)。

中斷點 - 條件式中斷點

借助運算式評估功能,偵錯器也支援條件式中斷點。您可以設定中斷點,使其僅在運算式評估為 true 時才觸發。

中斷點 - 資料中斷點

您可以讓偵錯器在變數的值發生變更時觸發中斷。請注意,資料中斷點只能在偵錯工作階段中設定。這意味著您需要先啟動應用程式並在一般中斷點處中斷。之後,您可以在 **[變數] (VARIABLES)** 檢視中選取一個欄位並設定資料中斷點。

Data Breakpoint

中斷點 - 記錄點 (Logpoints)

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

中斷點 - 觸發式中斷點

觸發的中斷點是在另一個中斷點被觸及後自動啟用的中斷點。在診斷僅在特定前提條件後發生的程式碼失敗案例時,它們非常有用。

可以透過右鍵點選符號邊界,選取 新增觸發的中斷點,然後選擇哪個其他中斷點來啟用該中斷點。

運算式評估

偵錯器也允許您在 **[監看式] (WATCH)** 視窗以及偵錯主控台中評估運算式。

Hot Code Replace (熱程式碼替換)

偵錯器支援的另一項進階功能是「Hot Code」替換。Hot Code Replace (HCR) 是一種偵錯技術,Debugger for Java 透過偵錯通道將類別變更傳輸到另一個 Java 虛擬機器 (JVM)。HCR 促進了實驗性開發,並鼓勵反覆試驗的編碼方式。有了這項新功能,您可以在啟動偵錯工作階段後修改開發環境中的 Java 檔案,偵錯器會將程式碼替換到執行中的 JVM 中。無需重新啟動,這就是為什麼它被稱為「熱」替換。以下是在 VS Code 中使用 Debugger for Java 進行 HCR 的說明。

您可以使用偵錯設定 java.debug.settings.hotCodeReplace 來控制如何觸發 Hot Code Replace。可能的設定值如下:

  • manual - 按一下工具列以套用變更 (預設)。
  • auto - 編譯後自動套用變更。
  • never - 停用 Hot Code Replace。

逐步執行篩選 (Step filtering)

此延伸模組支援逐步執行篩選,可過濾掉您在偵錯時不想查看或逐步進入的類型。利用此功能,您可以在 launch.json 中設定要篩選的套件,以便在逐步執行時跳過它們。

設定選項

有許多選項和設定可用於配置偵錯器。例如,透過啟動選項可以輕鬆配置 JVM 引數和環境變數。

有關設定專案的協助,請諮詢 Language Support for Java™ by Red Hat 延伸模組的說明文件。

對於許多常用的設定,VS Code Java Debugger Configuration 中提供了範例。該文件說明了 Java 偵錯器如何自動為您產生設定;如果您需要修改它們,也說明了如何針對主類別、不同的引數、環境、附加到其他 Java 程序以及使用更進階的功能進行操作。

以下是 LaunchAttach 可用的所有設定。關於如何編寫 launch.json 檔案的詳細資訊,請參閱 偵錯 (Debugging)

啟動 (Launch)

  • mainClass (必要) - 完整的類別名稱(例如 [java module name/]com.xyz.MainApp)或程式進入點的 java 檔案路徑。
  • args - 傳遞給程式的命令列引數。使用 "${command:SpecifyProgramArgs}" 來提示輸入程式引數。它接受字串或字串陣列。
  • sourcePaths - 程式額外的原始程式碼目錄。預設情況下,偵錯器會從專案設定中尋找原始程式碼。此選項允許偵錯器在額外的目錄中尋找原始程式碼。
  • modulePaths - 啟動 JVM 的模組路徑 (modulepaths)。如果未指定,偵錯器會自動從目前專案中解析。
    • $Auto - 自動解析目前專案的模組路徑。
    • $Runtime - 目前專案的「runtime」範圍內的模組路徑。
    • $Test - 目前專案的「test」範圍內的模組路徑。
    • !/path/to/exclude - 從模組路徑中排除指定的路徑。
    • /path/to/append - 將指定的路徑附加到模組路徑。
  • classPaths - 啟動 JVM 的類別路徑 (classpaths)。如果未指定,偵錯器會自動從目前專案中解析。
    • $Auto - 自動解析目前專案的類別路徑。
    • $Runtime - 目前專案的「runtime」範圍內的類別路徑。
    • $Test - 目前專案的「test」範圍內的類別路徑。
    • !/path/to/exclude - 從類別路徑中排除指定的路徑。
    • /path/to/append - 將指定的路徑附加到類別路徑。
  • encoding - JVM 的 file.encoding 設定。如果未指定,將使用 'UTF-8'。可能的值可在 Supported Encodings (支援的編碼) 中找到。
  • vmArgs - JVM 的額外選項與系統屬性(例如 -Xms<size> -Xmx<size> -D<name>=<value>),它接受字串或字串陣列。
  • projectName - 偵錯器搜尋類別時優先使用的專案。不同的專案中可能存在重複的類別名稱。當偵錯器在啟動程式時尋找指定的 main 類別時,此設定也適用。當工作區有多個 Java 專案時,必須指定此項目,否則運算式評估和條件式中斷點可能無法運作。
  • cwd - 程式的工作目錄。預設為 ${workspaceFolder}
  • env - 程式的額外環境變數。
  • envFile - 包含環境變數定義的檔案之絕對路徑。
  • stopOnEntry - 啟動後自動暫停程式。
  • console - 啟動程式所指定的主控台。如果未指定,則使用使用者設定 java.debug.settings.console 中指定的主控台。
    • internalConsole - VS Code 偵錯主控台(不支援輸入串流)。
    • integratedTerminal - VS Code 整合終端機。
    • externalTerminal - 可在使用者設定中配置的外部終端機。
  • shortenCommandLine - 當專案具有很長的類別路徑或大型 VM 引數時,啟動程式的命令列可能會超過 OS 允許的最大命令列字串限制。此設定項目提供了多種縮短命令列的方法。預設為 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 - 逐步執行時跳過合成方法 (Synthetic methods)。
    • skipStaticInitializers - 逐步執行時跳過靜態初始化方法。
    • skipConstructors - 逐步執行時跳過建構函式。

附加
  • hostName (必要) - 遠端偵錯目標的主機名稱或 IP 位址。
  • port (必要) - 遠端偵錯目標的偵錯連接埠。
  • processId - 使用程序選擇器選擇要附加的程序,或是以整數形式輸入程序 ID (PID)。
    • ${command:PickJavaProcess} - 使用程序選擇器選擇要附加的程序。
    • 整數 PID - 附加到指定的本機程序。
  • timeout - 重新連線前的逾時值,以毫秒為單位(預設為 30000 ms)。
  • sourcePaths - 程式額外的原始程式碼目錄。預設情況下,偵錯器會從專案設定中尋找原始程式碼。此選項允許偵錯器在額外的目錄中尋找原始程式碼。
  • projectName - 偵錯器搜尋類別時優先使用的專案。不同的專案中可能存在重複的類別名稱。當工作區有多個 Java 專案時,必須指定此項目,否則運算式評估和條件式中斷點可能無法運作。
  • stepFilters - 逐步執行時跳過指定的類別或方法。
    • classNameFilters - [已棄用 - 由 skipClasses 取代] 逐步執行時跳過指定的類別。類別名稱應為完整限定名稱。支援萬用字元。
    • skipClasses - 逐步執行時跳過指定的類別。您可以使用內建變數(如 '$JDK' 和 '$Libraries')跳過一組類別,或新增特定的類別名稱運算式,例如 java.**.Foo
    • skipSynthetics - 逐步執行時跳過合成方法 (Synthetic methods)。
    • 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。有關用法和限制的詳細資訊,請參閱 Hot Code Replace wiki 頁面
    • manual - 按一下工具列以套用變更。
    • auto - 編譯後自動套用變更。
    • never - 永不套用變更。
  • java.debug.settings.enableHotCodeReplace:啟用 Java 程式碼的 Hot Code Replace。請確保 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。
  • 無法完成 Hot Code Replace。
  • 請在 launch.json 中指定遠端偵錯目標的主機名稱和連接埠。
  • 評估失敗。原因:無法評估,因為執行緒已恢復執行。
  • 找不到包含 main 方法的類別。
  • 啟動偵錯器時,沒有 vscode.java.startDebugSession 的 delegateCommandHandler。
  • 解析類別路徑失敗。
  • 不支援要求類型 "X"。僅支援 "launch" 和 "attach"。

意見反應與問題

您可以在 vscode-java-debug 儲存庫中找到完整的問題清單。您可以提交 錯誤報告或功能建議,並參與社群驅動的 vscode-java-debug Gitter 頻道

後續步驟

繼續閱讀以了解

  • 偵錯 (Debugging) - 了解如何將 VS Code 中的偵錯器用於您的任何語言專案。

關於 Java 部分

© . This site is unofficial and not affiliated with Microsoft.