Javaアプリケーションのリモートデバッグ


254

LinuxマシンでJavaアプリケーションを実行しています。以下を使用してJavaアプリケーションを実行します。

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

このLinuxマシンでTCPのポート4000を開きました。Windows XPマシンのEclipseを使用して、このアプリケーションに接続しようとしています。私も窓を開けました。

どちらのマシンもLAN上にありますが、デバッガをJavaアプリケーションに接続できないようです。何が悪いのですか?




まったく重複していません。まず、これは古い質問です。第二に、この質問への答えはデバッグ環境にとらわれないはずです。
Addison

回答:


476

編集:一部の人々がここで呼び出しをカットアンドペーストしていることに気づきました。私が最初に出した答えは、OPにのみ関連していました。次に、よりモダンな呼び出しスタイルを示します(従来のポート8000​​の使用を含む)。

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

元の答えは次のとおりです。


これを試して:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

ここで2つのポイント:

  1. runjdwpオプションにスペースはありません。
  2. オプションはクラス名の前にあります。クラス名の後にある引数はすべて、プログラムの引数です。


2
@DJGummikuhいいね!新しいスタイルの-agentlibオプションを使用して、カットアンドペーストを楽しむことができるように、投稿を更新しました。:-)
Chris Jester-Young、

リモートデバッグを実行するマシンにリモートアプリのソースコードが常に存在する必要がありますか?
MasterJoe2 2017

ソースコードを知る必要があります。.javaファイルがあるか、または.jar / .classファイルが逆コンパイラと組み合わされています。EclipseなどのIDEには、JDecompilerなどの逆コンパイラをインストールして、.javaファイル(コメントを除く)であるかのように.classファイルをデバッグできるようにすることができます。
イワンサト

1
このstackoverflow.com/a/138518/500902からのコメントを繰り返す価値があるのは、「Java 9の "address = 1044"がすべてのインターフェースで常にリッスンしているわけではないからです。 "address = *:1044"は、Java 9+がJava 8のように動作するようにします」別のホストからのデバッグを許可する
Marvin

84

JDK 1.3以前の場合:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

JDK 1.4の場合

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

新しいJDKの場合:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

必要に応じてポート番号を変更してください。

Java technotesから

5.0以降では、-agentlib:jdwpオプションを使用して、JDWPエージェントにオプションをロードおよび指定します。5.0より前のリリースでは、-Xdebugおよび-Xrunjdwpオプションが使用されます(5.0の実装では-Xdebugおよび-Xrunjdwpオプションもサポートされますが、5.0のJDWPエージェントはJVM TIインターフェースを使用するため、新しい-agentlib:jdwpオプションが推奨されます。古いJVMDIインターフェースではなくVM)

JVMツールインターフェースのドキュメントから、もう1つ注意する必要があります

JVM TIはJDK 5.0で導入されました。JVM TIは、Java仮想マシンプロファイラインターフェイス(JVMPI)およびJava仮想マシンデバッグインターフェイス(JVMDI)に代わるものです。これらは、JDK 6以降、提供されなくなりました。


以下は、Eclipseのデフォルト設定で機能します。-agentlib:jdwp = transport = dt_socket、server = y、address = 8000
Sundae

29

手順:

  1. 上記の投稿で述べたように、デバッグオプションを使用してリモートJavaアプリケーションを起動します。
  2. ホストとポートを指定して、Eclipseをリモートデバッグ用に構成します。
  3. Eclipseでリモートデバッグを開始し、接続が成功するまで待ちます。
  4. ブレークポイントを設定してデバッグします。
  5. アプリケーションの最初からデバッグする場合は、suspend = yを使用します。これにより、Eclipseから接続するまでリモートアプリケーションが中断されたままになります。

詳細については、Javaリモートデバッグのステップバイステップガイドをご覧ください。



8

議論の順序が重要であることを強調したいと思います。

私にとって java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarコマンドはデバッガポートを開きます

しかし、java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000コマンドはしません


3
それは、2番目の例では、「app.jar」以降のすべてがメインメソッドに引数として渡されるためだと思います
xoX Zeus Xox

@xoXZeusXoxハハ。はい、それは引数として渡されました。言及いただきありがとうございます。
MrBlack

1

これは、リモートデバッグ用にEclipseデバッガーをセットアップする方法です。

Eclipse設定:

1. [実行]ボタンをクリックします2.
デバッグ構成を
選択します3. [リモートJavaアプリケーション]を選択します
4.新しい構成

  • 名前:GatewayPortalProject
  • プロジェクト:GatewayPortal-portlet
  • 接続タイプ:ソケット接続
  • 接続プロパティ:i)localhost ii)8787

JBossの場合:

1. /path/toJboss/jboss-eap-6.1/bin/standalone.confvmのを次のように変更します。#を削除して、次の行のコメントを解除します。

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Tomcatの場合:

catalina.batファイル:

ステップ1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

ステップ2:

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"

手順3:以下のようにコマンドプロンプトからTomcatを実行します。

catalina.sh jpda start

次に、デバッグするJavaクラスにブレークポイントを設定する必要があります。


Java 8では、JDKはJAVA_TOOL_OPTIONS環境変数をサポートしているため、使用する必要のあるすべてのJavaアプリケーションでデバッガーを有効にできます JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
Nathan Niesen、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.