27

jpda をオンにして tomcat を起動した後、私の会社では、Eclipse で多数の Web アプリケーションをリモート デバッグできます。さまざまな理由から、会社のファイアウォールの外側から同じ Web アプリケーションを開発してリモート デバッグする必要があり、そのサーバーにはポート 22 の ssh 経由でしかアクセスできません。

最も必要なポート (svn、nexus、tomcat 自体、サーバーから、またはサーバー経由) を localhost にトンネリングし、これらのサービスは正常に動作しますが、Eclipse デバッガーを起動できません。2 回目の試行から、「パケット XXX の待機中に接続がタイムアウトしました」または「接続が拒否されました」というメッセージが表示されます。サーバーの nmap で確認すると、最初の接続試行の前に開いているポートが報告され、その後は閉じられます。catalina.out に興味深い出力ログがありません

トンネルを開始するために使用するコマンドは次のとおりです。

ssh -L 8000:localhost:8000 user@mycompany.com

iptables は、テストのためにサーバーとローカル マシンの両方で一時的に停止されました。

何か不足していますか?他のポートを localhost に転送する必要がありますか? それとも何らかの形で名前解決に関係していますか?

編集

Eclipse からの接続試行前にポートを開きます。

root@lnxulisse:/opt/apache-tomcat-6.0.32/bin# lsof -p 2147  -n |grep TCP
java    2147 root    4u  IPv4 640850      0t0     TCP *:8000 (LISTEN)
java    2147 root   38u  IPv6 640859      0t0     TCP *:http-alt (LISTEN)
java    2147 root   40u  IPv6 640865      0t0     TCP *:https (LISTEN)
java    2147 root   46u  IPv6 640908      0t0     TCP 127.0.0.1:18005 (LISTEN)
java    2147 root   48r  IPv6 642625      0t0     TCP 172.24.0.82:48347->172.24.0.82:mysql (ESTABLISHED)
java    2147 root  181u  IPv6 640891      0t0     TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)

以降:

java    2147 root    4u  IPv6 642769      0t0     TCP 172.24.0.82:48956->172.24.0.82:mysql (ESTABLISHED)
java    2147 root    5u  IPv4 640851      0t0     TCP 127.0.0.1:8000->127.0.0.1:34193 (ESTABLISHED)
java    2147 root   38u  IPv6 640859      0t0     TCP *:http-alt (LISTEN)
java    2147 root   40u  IPv6 640865      0t0     TCP *:https (LISTEN)
java    2147 root   46u  IPv6 640908      0t0     TCP 127.0.0.1:18005 (LISTEN)
java    2147 root  181u  IPv6 640891      0t0     TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)

返される正確な日食エラーは次のとおりです。

Exception occurred during launch
Failed to connect to remote JVM. Connection timed out.
Timeout occurred while waiting for packet 204.

(パケット番号は試行ごとに異なります)。

workspace/.metadata/.log私は得る:

!ENTRY org.eclipse.osgi 2 0 2011-07-17 18:43:53.024
!MESSAGE While loading class "org.eclipse.core.net.proxy.IProxyService", thread "Thread[main,6,main]" timed out waiting (5000ms) for thread "Thread[Thread-6,5,main]" to finish starting bundle "org.eclipse.core.net_1.2.1.r35x_20090812-1200 [232]". To avoid deadlock, thread "Thread[main,6,main]" is proceeding but "org.eclipse.core.net.proxy.IProxyService" may not be fully initialized.
!STACK 0
org.osgi.framework.BundleException: State change in progress for bundle "reference:file:plugins/org.eclipse.core.net_1.2.1.r35x_20090812-1200.jar" by thread "Thread-6".
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.beginStateChange(AbstractBundle.java:1073)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:278)
[...]

!ENTRY org.eclipse.ui.ide 4 4 2011-07-17 18:43:53.028
!MESSAGE Proxy service could not be found.

eclipse は直接インターネット接続用に構成されています。

編集2

解決策はここにあると思います:

http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

しかし、彼の JNDI/RMI 設定と、それが私の構成にどの程度当てはまるかを理解するのに苦労しています。

編集3

これは、「 」<lan|local ip address>の代わりに使用すると答えた人のための明確化です。<localhost>

  • コンピューター A: 会社の私のワークステーション
  • コンピューター B: 自宅の私のワークステーション
  • コンピューター C: Tomcat を実行しているサーバー

B と C は、同じネットワーク インフラストラクチャ内の 2 つの異なるサブネットワークにあります。外部からの C のポート 22 への接続のみが許可されます (ネットワークの内部はわかりません)。

A は「外部」です (動的 IP アドレスを使用した DSL 接続)。

Debugging on C from B via ssh tunnel -> works
Debugging on C from A via ssh tunnel -> connection timed out while waiting for packet XXX
4

5 に答える 5

10

リモートデバッグを行うときに、この問題が頻繁に発生しました。この問題の正確な理由はわかりませんが、以下の解決策を使用しました。おそらくそれはあなたにも役立つでしょう:

それ以外の

ssh -L 8000:localhost:8000 user@remotehost

使用されている

ssh -L 8000:remotehost:8000 user@remotehost

SSHトンネルを作成するため(2番目の例のポート番号の間にlocalhostではなくremotehostに注意してください)。リモートホストの名前の代わりに、リモートホストの通常のIPアドレス(ループバックアドレス127.0.0.1ではなく、実際のローカルネットワークIPアドレス)を使用することもできます。

それがお役に立てば幸いです!

于 2012-11-25T15:58:50.780 に答える
10

この記事では、リモートの Java 仮想マシン (JVM) がデバッグ モードでリッスンしているデフォルトのポートは 1044 であることを示唆しています。リモート JVM が実行されているポートもトンネリングする必要があります。


より一般的には、wireshark/tcpdump を実行して、デバッガーの起動時にどのポートへの接続試行が行われたかを確認できます。


編集

私が試すいくつかのこと:

  • リモートホストをチェックします(たとえば、ps auxwwwLinuxの場合)どの引数を使用しますか(背後にあるもの、-Xrunjdwpまたはlsof -p PID_OF_JVM_TO_BE_DEBUGGEDリッスンするTCPポートを探します(出力でTCPおよびLISTENの行を探しlsofます)
  • リモートホスト上の JVM がlo、ネットワークインターフェースではなく、インターフェースでリッスンしていることを確認してください (これは、sshlocalhostのオプションで指定したものです)。-L
  • Eclipse を起動するマシンでデバッガーを手動で起動しても問題ありませjdb -attach localhost:8000んか? (リモートホストでこれを試して、デバッガーがポート 8000 で実行されていることを確認することもできます)
  • Eclipse が接続を試みていることを確認してくださいlocalhost(オプション ssh を使用して最初の 8000 の前にバインド アドレスを指定しない場合は-L、インターフェイスでリッスンしloます) 。
于 2011-07-16T18:40:30.117 に答える
8

リモート Tomcat インスタンスが のようなもので開始されたと仮定して、次の-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=nコマンドを試してください。

ssh -L 8000:0.0.0.0:8000 user@mycompany.com -N

私の Macで、Tomcat インスタンスが で開始されたローカルで試し、Eclipse 内でポート 10701 に接続しようとすると、「リモート VM com.sun.jdi.connect.spi.ClosedConnectionException への接続に失敗しました」と表示され続けました。トンネルコマンドを に変更することで、Eclipse がアタッチできるようになりました。ssh -L 10701:localhost:10700 user@localhost -N-Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=nssh -L 10701:0.0.0.0:10700 user@localhost -N

于 2012-11-18T23:57:47.283 に答える
3

-Xrunjdwpパラメーターの正確なパラメーターを教えてください。

また、デバッグのためにさまざまな方法を試しましたか(server = y / n、suspend = y / n)?

おそらく、接続を逆にする(デバッガーをtomcatに接続させるのではなく、tomcatをデバッガーに接続させる)ことが役立つ場合があります。

于 2012-11-15T07:39:46.963 に答える
3

さて、私は久しぶりに自分自身に答えています。私の特定のケースでは、解決策はEclipse JVMをリッスンモードにすることでした:

Connection Type: "Standard (Socket Listen)"

トンネルの方向を逆にします。

ssh -L 8001:localhost:8001 user@work   (run on server (S), "localhost" is W)
ssh -R 8001:localhost:8001 user@work   (run at home (H), "localhost" is W)

いくつかの説明:質問のように、私の状況は次のとおりでした:

  H  -------------------> S     not working  ( ssh -L 8001:S:8001 user@S  from H)
  H           W  -------> S     working      ( ssh -L 8001:S:8001 user@S  from W)
 home        work      server

このように反転しながら:

  H  <------- W           S     ssh -R 8001:localhost:8001 user@W  (from H)
  H           W  <------- S     ssh -L 8001:localhost:8001 user@W  (from S)
 home        work      server

トリックをしました。つまり、S:8001 に書き込まれたものはすべて W:8001 に転送され、次に W:8001 に書き込まれたものはすべて H:8001 に転送され、そこで私の Eclipse JVM がリッスンします。

S 上の tomcat JVM は、引数を指定して server=n で開始する必要があります。

-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001
于 2013-09-16T14:26:16.067 に答える