VS Codeのエージェントモードを拡張するには、を試してください!

Java の実行とデバッグ

Visual Studio Code では、Debugger for Java 拡張機能を通じて Java アプリケーションをデバッグできます。これは、Language Support for Java™ by Red Hat を拡張する Java Debug Server に基づく軽量の Java デバッガーです。

サポートされているデバッグ機能の一覧は次のとおりです。

  • 起動/アタッチ
  • ブレークポイント
  • 例外
  • 一時停止と続行
  • ステップイン/アウト/オーバー
  • 変数
  • 呼び出し履歴
  • スレッド
  • デバッグ コンソール
  • 評価
  • ホット コード置換

Java デバッガーはオープンソース プロジェクトであり、GitHub リポジトリを通じてコントリビューターの協力を歓迎しています。

以下の機能の使用中に問題が発生した場合は、イシューを登録してご連絡ください。

インストール

Visual Studio Code で完全な Java 言語サポートを得るには、Debugger for Java 拡張機能を含む Extension Pack for Java をインストールできます。

Extension Pack for Javaをインストールする

拡張機能パックの使用を開始する方法の詳細については、「Java の使用を開始する」チュートリアルを参照してください。

構成

既定では、デバッガーは main クラスを自動的に検索し、アプリケーションを起動するための既定の起動構成をメモリ内に生成することで、そのまま実行されます。

起動構成をカスタマイズして永続化する場合は、[実行とデバッグ] ビューの [launch.json ファイルを作成します] リンクを選択します。

Debug Menu

launch.json ファイルは、ワークスペース (プロジェクトのルート フォルダー) の .vscode フォルダーにあります。

launch.json の作成方法の詳細については、「起動構成」を参照してください。Java の構成オプションの詳細については、「構成オプション」を参照してください。

実行とデバッグ

デバッガー拡張機能は、Java アプリケーションを実行およびデバッグするための複数の方法を提供します。

CodeLens から実行する

main() 関数の CodeLensRun|Debug が表示されます。

CodeLens

エディター メニューから実行する

デバッグを開始するもう 1 つの方法は、エディター上部のタイトル バーから [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 は、行ブレークポイント、条件付きブレークポイント、データ ブレークポイント、ログポイントなど、さまざまなブレークポイントをサポートしています。

ブレークポイント - 条件付きブレークポイント

式評価の助けを借りて、デバッガーは条件付きブレークポイントもサポートします。式が true と評価されたときに中断するようにブレークポイントを設定できます。

ブレークポイント - データ ブレークポイント

変数の値が変更されたときにデバッガーを中断させることができます。データ ブレークポイントはデバッグ セッション内でのみ設定できることに注意してください。これは、アプリケーションを起動し、最初に通常のブレークポイントで中断する必要があることを意味します。その後、[変数] ビューでフィールドを選択し、データ ブレークポイントを設定できます。

Data Breakpoint

ブレークポイント - ログポイント

ログポイントも Java デバッガーでサポートされています。ログポイントを使用すると、コードを編集せずにデバッグ コンソールに出力を送信できます。アプリケーションの実行フローを停止しないため、ブレークポイントとは異なります。

ブレークポイント - トリガーされたブレークポイント

トリガーされたブレークポイントとは、別のブレークポイントに到達すると自動的に有効になるブレークポイントです。これらは、特定の事前条件の後にのみ発生するコードの失敗ケースを診断する際に非常に役立ちます。

トリガーされたブレークポイントは、グリフマージンを右クリックし、トリガーされたブレークポイントの追加を選択し、その後、どの他のブレークポイントがこのブレークポイントを有効にするかを選択することで設定できます。

式の評価

デバッガーでは、[ウォッチ] ウィンドウとデバッグ コンソールで式を評価することもできます。

ホット コード置換

デバッガーがサポートするもう 1 つの高度な機能は、「ホット コード」置換です。ホット コード置換 (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 デバッガーがどのように構成を自動的に生成するか、また、変更が必要な場合に main クラス、さまざまな引数、環境、他の Java プロセスへのアタッチ、およびより高度な機能の使用法でそれを行う方法について説明しています。

以下は、LaunchAttach で使用できるすべての構成です。launch.json ファイルの書き方の詳細については、「デバッグ」を参照してください。

起動

  • mainClass (必須) - 完全修飾クラス名 (例: [java module name/]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 - デバッガーがクラスを検索する優先プロジェクト。異なるプロジェクトに重複したクラス名が存在する可能性があります。この設定は、プログラムの起動時にデバッガーが指定された 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 - ステップ実行時に合成メソッドをスキップします。
    • skipStaticInitializers - ステップ実行時に静的初期化子メソッドをスキップします。
    • skipConstructors - ステップ実行時にコンストラクター メソッドをスキップします。

アタッチ

  • hostName (必須) - リモートのデバッグ対象のホスト名または IP アドレス。
  • port (必須) - リモートのデバッグ対象のデバッグ ポート。
  • processId - プロセス ピッカーを使用してアタッチするプロセスを選択するか、整数としてのプロセス ID。
    • ${command:PickJavaProcess} - プロセス ピッカーを使用してアタッチするプロセスを選択します。
    • 整数 PID - 指定されたローカル プロセスにアタッチします。
  • timeout - 再接続するまでのタイムアウト値 (ミリ秒単位、既定値は 30000 ms)。
  • sourcePaths - プログラムの追加のソース ディレクトリ。デバッガーは既定でプロジェクト設定からソース コードを検索します。このオプションにより、デバッガーは追加のディレクトリでソース コードを検索できます。
  • projectName - デバッガーがクラスを検索する優先プロジェクト。異なるプロジェクトに重複したクラス名が存在する可能性があります。ワークスペースに複数の Java プロジェクトがある場合に必要です。そうしないと、式の評価と条件付きブレークポイントが機能しない場合があります。
  • stepFilters - ステップ実行時に指定されたクラスまたはメソッドをスキップします。
    • classNameFilters - [非推奨 - skipClasses に置き換えられました] ステップ実行時に指定されたクラスをスキップします。クラス名は完全修飾名である必要があります。ワイルドカードがサポートされています。
    • skipClasses - ステップ実行時に指定されたクラスをスキップします。'$JDK' や '$Libraries' などの組み込み変数を使用してクラスのグループをスキップしたり、java.**.Foo などの特定のクラス名式を追加したりできます。
    • skipSynthetics - ステップ実行時に合成メソッドをスキップします。
    • skipStaticInitializers - ステップ実行時に静的初期化子メソッドをスキップします。
    • skipConstructors - ステップ実行時にコンストラクター メソッドをスキップします。

ユーザー設定

  • java.debug.logLevel: VS Code に送信されるデバッガー ログの最小レベル。既定値は warn です。
  • java.debug.settings.showHex: [変数] で数値を 16 進形式で表示します。既定値は 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 コードのホット コード置換を有効にします。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.jsonconsole 構成を変更してください。
    • 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: 1 つの JDWP 要求で要求できる変数またはフィールドの最大数。値が大きいほど、変数ビューを展開するときにデバッグ対象が要求される頻度が低くなります。また、値が大きいと JDWP 要求がタイムアウトする可能性があります。既定値は 100 です。
  • java.debug.settings.jdwp.requestTimeout: デバッガーがターゲット JVM と通信するときの JDWP 要求のタイムアウト (ms)。既定値は 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 はクラスパス上にありません。構文エラーのみが報告されます。
  • プログラム エラー: main クラス 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拡張機能について学びます。