に参加して、VS Code の AI 支援開発について学びましょう。

Javaの実行とデバッグ

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

以下は、サポートされているデバッグ機能のリストです。

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

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

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

デバッグを開始するもう1つの方法は、エディタの上部タイトルバーから「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デバッグセッションのグローバルコンソールを構成することもできます。

Breakpoints

Debugger for Javaは、行ブレークポイント、条件付きブレークポイント、データブレークポイント、ログポイントなど、さまざまなブレークポイントをサポートしています。

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

式の評価を利用して、デバッガーは条件付きブレークポイントもサポートします。式がtrueと評価されたときにブレークポイントを設定して停止させることができます。

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

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

Data Breakpoint

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

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

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

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

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

Expression evaluation

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

ホットコード置換

デバッガーがサポートするもう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プロセスへのアタッチ、より高度な機能の使用方法について説明しています。

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

起動

  • 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ミリ秒)。
  • 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: 変数でコレクションおよびマップクラスの論理構造を表示します。デフォルトは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引数。たとえば、ヒープサイズを1GBに増やし、アサーションを有効にするには'-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テストランナー拡張機能を使用してVS Code内でJavaをテストします。
  • Java拡張機能 - VS Code向けのさらに便利なJava拡張機能について学びます。
© . This site is unofficial and not affiliated with Microsoft.