Java の実行とデバッグ

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

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

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

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

以下の機能を使用している際に問題が発生した場合は、issueを送信して私たちに連絡してください。

インストール

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

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

デバッグを開始するもう 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 と評価されたときに中断するようにブレークポイントを設定できます。

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

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

Data Breakpoint

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

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

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

トリガーブレークポイントとは、別のブレークポイントがヒットしたときに自動的に有効になるブレークポイントのことです。特定の前提条件を満たした場合にのみ発生するコードの障害ケースを診断する際に非常に役立ちます。

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

式の評価

デバッガーでは、デバッグ コンソールだけでなく [ウォッチ式] (WATCH) ウィンドウでも式を評価できます。

ホット コード リプレース

デバッガーがサポートするもう 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 デバッガーの構成 でサンプルが提供されています。このドキュメントでは、Java デバッガーが構成を自動生成する方法について説明し、変更が必要な場合にメイン クラス、異なる引数、環境、他の Java プロセスへのアタッチ、より高度な機能の使用法などを変更する方法を説明しています。

以下は、Launch (起動) と Attach (アタッチ) で利用可能なすべての構成です。launch.json ファイルの記述方法の詳細については、デバッグ を参照してください。

Launch (起動)

  • 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 引数が大きい場合、プログラムを起動するためのコマンドラインが、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 が無効になっていないことを確認してください。使用法と制限事項の詳細については、ホット コード リプレースの 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 引数。たとえば、'-Xmx1G -ea' を使用してヒープ サイズを 1 GB に増やし、アサーションを有効にします。特定のデバッグ セッション用に 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 拡張機能について学びます。
© . This site is unofficial and not affiliated with Microsoft.