Java リモートデバッグ
- 前提条件
- Java アプリケーションの作成
- Java コードを書く
- Java リモートデバッグ
- Java アプリケーションを実行する
- プロセスへのデバッガーのアタッチ
- Java デバッグ ワイヤ プロトコル
リモート デバッガーをアタッチできるようにするには、特定のパラメーターを使用して Java アプリケーションを実行する必要があります。 作業を完了する実行/デバッグ構成をセットアップする方法を探ります。
前提条件
このチュートリアルに従うには、次のものが稼働している必要があります。
- Java 18 および環境変数を設定する必要があります。
- IntelliJ IDEA Community Edition IDE (ここ からダウンロードすることもできます)。
- リモート マシンの IP アドレスとポート番号 (ローカル マシンで作業している場合は、この記事に従うこともできます)
残りのチュートリアルは、この IDE の初心者を考慮して 6つのセクションに分かれています。 すでに IntelliJ IDEA を使用している場合は、目的のセクションにジャンプできます。 それらのすべてを以下に示します。
Java アプリケーションの作成
ステップ 1: IntelliJ IDEA IDE を開きます。
ステップ 2: [ファイル] -> [新規] -> [プロジェクト] をクリックします。 次の画面が表示されます。New Project
をクリックし、プロジェクトの名前を書き、保存する場所を設定します。
Java
言語と IntelliJ
ビルド システムが選択されていることを確認します。 IntelliJ IDEA は、デフォルトの場所に JDK (Java Development Kit) がインストールされているかどうかを自動的に検出します。
それ以外の場合は、ブラウザに移動せずに参照して JDK を追加し、ここからダウンロードできます。 最後に、作成
ボタンをクリックします。
ステップ 3: src
Folder -> New -> Java Class を右クリックして、Java クラスを作成します。
Java クラスの名前を書きます。 名前だけ書くと≪デフォルトパッケージ≫に作成されます。
目的のパッケージに Java クラスを作成するには、次のように名前を記述します。 パッケージと com.company.remotedebugging
および RemoteDebugging.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 に移動します。
ステップ 2: 左上隅にある +
記号をクリックし、Remote JVM Debug
を選択します。
ステップ 3: いくつかの設定を行います。 最初に、この run
構成がどのように呼び出されるかを示す名前を書きます。
デフォルト値を使用することもできますが、区別するために別の名前を付けることをお勧めします。 Debugger mode
および Transport
オプションで Attach to remote JVM
および Socket
が選択されていることを確認します。
次に、このアプリを実行するマシンの IP アドレスを書き込みます。 同じマシンで実行するため、localhost
と記述します。
アプリケーションが別のマシンで実行されている場合は、IP アドレスを書き込むことに注意してください。 たとえば、IP は 192.168.15.119
のようになります。
次に、リモート接続用に開いておきたいポート番号を書きます。 ここで、コマンド ライン引数をメモ帳にコピーします (このチュートリアルの後半で使用します)。
これらの VM オプションは、ホスト アプリケーションを開始するために必要です。 適用
をクリックしてから、OK
をクリックします。
参考までに、次のスクリーンショットを参照してください。
ホスト アプリケーションのセットアップ
実行 / デバッグ構成を使用してホスト アプリケーションをセットアップしていますが、ホスト アプリの実行方法に制限はありません。
Java クラスの本体 (この例では、Java クラスは RemoteDebugging.java
) の任意の場所を右クリックし、Modify Run Configuration
を選択します。 次の画面が表示されます。
Modify options
をクリックし、Add VM options
を選択すると、次の画面が開きます。 デバッガーのセットアップ中にメモ帳にコピーしたコマンドライン引数を書き込み、次のスクリーンショットに示すように貼り付けます。
最後に、適用
をクリックしてからOK
ボタンをクリックします。
Java アプリケーションを実行する
Run -> Run に移動して、アプリケーションを実行します。 Java クラスが選択されていることを確認します。
プログラム出力の最初の行は次のようになります。
アドレスでトランスポート dt_socket をリッスン: 5005
これは、デバッグ エージェントが正常に有効になったことを示しています。 これで、Java プログラムは着信デバッガー接続を受け入れる準備が整いました。
プロセスへのデバッガーのアタッチ
ブレークポイントを追加する行のガターをクリックします。 以下のスクリーンショットで強調表示されている次の行にブレークポイントを追加します。
前のセクションで行ったように、Run -> Run に移動して、アプリケーションを実行します。 プログラム出力で、Attach Debugger
をクリックします。
次のスクリーンショットに示すように、それを見つけることができます。
デバッガーが正常にアタッチされました。
その結果、プログラムはブレークポイントに到達するとすぐに中断されます。 式の評価など、デバッグ関連のアクションを実行できます。
完了したら、デバッグ
ツールウィンドウのセッションタブを閉じるか、左側の赤い四角
をクリックしてデバッガセッションを閉じることを忘れないでください。
Java デバッグ ワイヤ プロトコル
Java Debug Wire Protocol (JDWP
とも呼ばれる) は、デバッガとデバッグ対象
の間の通信に使用されるプロトコルです。 ここで、debuggee
はデバッグ中のアプリケーションであり、デバッガーはデバッグ中のアプリケーションに接続するプロセスです。
両方のアプリケーションを異なるマシンでも同じマシンでも実行できることに注意してください。 debuggee
アプリケーションを起動するために、JVM コマンドライン引数で JDWP
を使用しました。
以下に簡単に説明するさまざまなパラメーター (オプション) が必要です。
transport
は完全に必要な唯一のオプションです。 これは、どのトランスポート メカニズムが使用されるかを示します。 すべてのプラットフォームと互換性があり、さまざまなマシンでプロセスを実行できるdt_socket
を使用しています。 対照的に、dt_shmem
は、両方のプロセスが同じマシンで実行され、Windows でのみ作業したい場合に使用されます。server
オプションは必須ではありません。 このフラグがオンの場合、デバッガーへのアタッチ方法を定義します。 それは、アドレスがアドレス
オプションで定義されるプロセスを開示する。 それ以外の場合、JDWP
はデフォルトのものを公開します。suspend
オプションは、JVM (Java 仮想マシン) を中断して、デバッガーがアタッチするのを待つかどうかを定義します。address
オプションには、デバッグ対象によって公開されたアドレスとポート番号があります。 これは、文字列に変換されたアドレスを示すこともできます (たとえば、Windows でaddress
を指定せずにserver=y
を使用した場合はjavadebug
)。