Java リモートデバッグ

Mehvish Ashiq 2024年2月15日
  1. 前提条件
  2. Java アプリケーションの作成
  3. Java コードを書く
  4. Java リモートデバッグ
  5. Java アプリケーションを実行する
  6. プロセスへのデバッガーのアタッチ
  7. Java デバッグ ワイヤ プロトコル
Java リモートデバッグ

リモート デバッガーをアタッチできるようにするには、特定のパラメーターを使用して Java アプリケーションを実行する必要があります。 作業を完了する実行/デバッグ構成をセットアップする方法を探ります。

前提条件

このチュートリアルに従うには、次のものが稼働している必要があります。

  • Java 18 および環境変数を設定する必要があります。
  • IntelliJ IDEA Community Edition IDE (ここ からダウンロードすることもできます)。
  • リモート マシンの IP アドレスとポート番号 (ローカル マシンで作業している場合は、この記事に従うこともできます)

残りのチュートリアルは、この IDE の初心者を考慮して 6つのセクションに分かれています。 すでに IntelliJ IDEA を使用している場合は、目的のセクションにジャンプできます。 それらのすべてを以下に示します。

  1. Java アプリケーションの作成
  2. Javaコードを書く
  3. Javaリモートデバッグ
  4. Java アプリケーションの実行
  5. デバッガーをプロセスにアタッチ
  6. Java Debug Wire Protocol

Java アプリケーションの作成

ステップ 1: IntelliJ IDEA IDE を開きます。

ステップ 2: [ファイル] -> [新規] -> [プロジェクト] をクリックします。 次の画面が表示されます。New Project をクリックし、プロジェクトの名前を書き、保存する場所を設定します。

Java 言語と IntelliJ ビルド システムが選択されていることを確認します。 IntelliJ IDEA は、デフォルトの場所に JDK (Java Development Kit) がインストールされているかどうかを自動的に検出します。

それ以外の場合は、ブラウザに移動せずに参照して JDK を追加し、ここからダウンロードできます。 最後に、作成ボタンをクリックします。

Java リモート デバッグ - プロジェクトの作成

ステップ 3: src Folder -> New -> Java Class を右クリックして、Java クラスを作成します。

Java リモート デバッグ - Java クラスの作成

Java クラスの名前を書きます。 名前だけ書くと≪デフォルトパッケージ≫に作成されます。

目的のパッケージに Java クラスを作成するには、次のように名前を記述します。 パッケージと com.company.remotedebugging および RemoteDebugging.java という名前のファイルがそれぞれ作成されます。

Java リモート デバッグ - Java クラスの名前

Java コードを書く

コード例:

// You may have a different package name. Write yours here
package com.company.remotedebugging;

// RemoteDebugging class
public class RemoteDebugging {
  // main method
  public static void main(String[] args) {
    String fullName = "Mehvish Ashiq";
    System.out.println("Star Printing");

    // iterate over the string variable
    for (int i = 0; i < fullName.length(); i++) {
      try {
        // sleep for 500 milliseconds
        Thread.sleep(500);
      } // end try
      catch (InterruptedException e) {
        e.printStackTrace();
      } // end catch
      // print character
      System.out.println(fullName.charAt(i));
    } // end for-loop

    System.out.println("Task Completed!");
  } // end main function
} // end RemoteDebugging Class

Java リモートデバッグ

最初にアプリケーションを実行するため、次にアプリケーションにアタッチするための 2つの実行 / デバッグ構成を行うだけで済みます。 どうすればそれができるか見てみましょう。

デバッガーのセットアップ

ステップ 1: Run -> Edit Configurations に移動します。

Java リモート デバッグ - デバッガ画面 1 のセットアップ

ステップ 2: 左上隅にある + 記号をクリックし、Remote JVM Debug を選択します。

Java リモートデバッグ - デバッガ画面 2 のセットアップ

ステップ 3: いくつかの設定を行います。 最初に、この run 構成がどのように呼び出されるかを示す名前を書きます。

デフォルト値を使用することもできますが、区別するために別の名前を付けることをお勧めします。 Debugger mode および Transport オプションで Attach to remote JVM および Socket が選択されていることを確認します。

次に、このアプリを実行するマシンの IP アドレスを書き込みます。 同じマシンで実行するため、localhost と記述します。

アプリケーションが別のマシンで実行されている場合は、IP アドレスを書き込むことに注意してください。 たとえば、IP は 192.168.15.119 のようになります。

次に、リモート接続用に開いておきたいポート番号を書きます。 ここで、コマンド ライン引数をメモ帳にコピーします (このチュートリアルの後半で使用します)。

これらの VM オプションは、ホスト アプリケーションを開始するために必要です。 適用 をクリックしてから、OK をクリックします。

参考までに、次のスクリーンショットを参照してください。

Java リモートデバッグ - デバッガ画面 3 のセットアップ

ホスト アプリケーションのセットアップ

実行 / デバッグ構成を使用してホスト アプリケーションをセットアップしていますが、ホスト アプリの実行方法に制限はありません。

Java クラスの本体 (この例では、Java クラスは RemoteDebugging.java) の任意の場所を右クリックし、Modify Run Configuration を選択します。 次の画面が表示されます。

java リモート デバッグ - ホスト アプリ画面 1 のセットアップ

Modify options をクリックし、Add VM options を選択すると、次の画面が開きます。 デバッガーのセットアップ中にメモ帳にコピーしたコマンドライン引数を書き込み、次のスクリーンショットに示すように貼り付けます。

最後に、適用をクリックしてからOKボタンをクリックします。

Java リモート デバッグ - ホスト アプリのセットアップ画面 2

Java アプリケーションを実行する

Run -> Run に移動して、アプリケーションを実行します。 Java クラスが選択されていることを確認します。

Java リモート デバッグ - アプリ画面 1 を実行

プログラム出力の最初の行は次のようになります。

アドレスでトランスポート dt_socket をリッスン: 5005

これは、デバッグ エージェントが正常に有効になったことを示しています。 これで、Java プログラムは着信デバッガー接続を受け入れる準備が整いました。

プロセスへのデバッガーのアタッチ

ブレークポイントを追加する行のガターをクリックします。 以下のスクリーンショットで強調表示されている次の行にブレークポイントを追加します。

javaリモートデバッグ - デバッガ画面1を添付

前のセクションで行ったように、Run -> Run に移動して、アプリケーションを実行します。 プログラム出力で、Attach Debuggerをクリックします。

次のスクリーンショットに示すように、それを見つけることができます。

Java リモートデバッグ - デバッガ画面 2 を添付

デバッガーが正常にアタッチされました。

Java リモートデバッグ - デバッガ画面 4 を添付

その結果、プログラムはブレークポイントに到達するとすぐに中断されます。 式の評価など、デバッグ関連のアクションを実行できます。

Java リモートデバッグ - デバッガ画面 3 を添付

完了したら、デバッグツールウィンドウのセッションタブを閉じるか、左側の赤い四角をクリックしてデバッガセッションを閉じることを忘れないでください。

Java デバッグ ワイヤ プロトコル

Java Debug Wire Protocol (JDWPとも呼ばれる) は、デバッガとデバッグ対象の間の通信に使用されるプロトコルです。 ここで、debuggee はデバッグ中のアプリケーションであり、デバッガーはデバッグ中のアプリケーションに接続するプロセスです。

両方のアプリケーションを異なるマシンでも同じマシンでも実行できることに注意してください。 debuggee アプリケーションを起動するために、JVM コマンドライン引数で JDWP を使用しました。

以下に簡単に説明するさまざまなパラメーター (オプション) が必要です。

  1. transport は完全に必要な唯一のオプションです。 これは、どのトランスポート メカニズムが使用されるかを示します。 すべてのプラットフォームと互換性があり、さまざまなマシンでプロセスを実行できる dt_socket を使用しています。 対照的に、dt_shmem は、両方のプロセスが同じマシンで実行され、Windows でのみ作業したい場合に使用されます。
  2. server オプションは必須ではありません。 このフラグがオンの場合、デバッガーへのアタッチ方法を定義します。 それは、アドレスがアドレスオプションで定義されるプロセスを開示する。 それ以外の場合、JDWP はデフォルトのものを公開します。
  3. suspend オプションは、JVM (Java 仮想マシン) を中断して、デバッガーがアタッチするのを待つかどうかを定義します。
  4. address オプションには、デバッグ対象によって公開されたアドレスとポート番号があります。 これは、文字列に変換されたアドレスを示すこともできます (たとえば、Windows で address を指定せずに server=y を使用した場合は javadebug)。
著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook