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

Java の実行とデバッグ

Visual Studio Code では、Debugger for Java 拡張機能を通じて Java アプリケーションをデバッグできます。これは Java Debug Server に基づく軽量な Java デバッガーであり、Red Hat による Java™ 言語サポート を拡張するものです。

サポートされているデバッグ機能のリストを以下に示します。

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

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

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

インストール

Visual Studio Code で完全な Java 言語サポートを得るには、Debugger for Java 拡張機能を含む Extension Pack 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 デバッグセッションのグローバルコンソールを構成することもできます。

ブレークポイント

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 引数と環境変数の構成は、起動オプションで簡単に行うことができます。

プロジェクトのセットアップについては、Red Hat による Java™ 言語サポート 拡張機能のドキュメントを参照してください。

一般的に使用される多くの設定については、VS Code Java デバッガー構成 にサンプルが用意されています。このドキュメントでは、Java デバッガーがどのように構成を自動的に生成するか、および変更する必要がある場合に、メインクラス、異なる引数、環境、他の Java プロセスへのアタッチ、およびより高度な機能の使用方法について説明しています。

以下は、Launch および Attach で利用可能なすべての構成です。launch.json ファイルの作成方法の詳細については、デバッグ を参照してください。

起動

  • mainClass (必須) - 完全修飾クラス名 (例: [java module name/]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 引数がある場合、プログラムを起動するためのコマンドラインが 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 ミリ秒)。
  • 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 言語サポート拡張機能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.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 リクエストのタイムアウト (ミリ秒)。デフォルトは 3000 です。
  • java.debug.settings.vmArgs: Java プログラムを起動するためのデフォルトの VM 引数。たとえば、ヒープサイズを 1 GB に増やし、アサーションを有効にするには「-Xmx1G -ea」を使用します。特定のデバッグセッションの 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 の場合

  • Java テスト - Java Test Runner 拡張機能を使用して VS Code 内で Java をテストします。
  • Java拡張機能 - VS Code向けのさらに便利なJava拡張機能について学びます。