JpdaをオンにしてTomcatを起動した後、私の会社にいる間、Eclipseで多数のWebアプリケーションをリモートデバッグできます。いくつかの理由で、会社のファイアウォールの外側から同じWebアプリを開発してリモートデバッグする必要があり、ポート22のssh経由でのみそのサーバーにアクセスできます。
最も必要なポート(svn、nexus、Tomcat自体、サーバーから、またはサーバー経由)をlocalhostにトンネリングしましたが、これらのサービスは正常に機能しますが、Eclipseデバッガーを起動できません。 2回目の試行から、「パケットXXXの待機中に接続がタイムアウトしました」または「接続が拒否されました」というメッセージが表示されます。サーバー上のnmapを確認すると、最初の接続試行の前にポートが開いていることが報告され、その後は閉じられます。 catalina.outに興味深い出力ログがありません
トンネルを開始するために使用するコマンドは次のとおりです。
ssh -L 8000:localhost:8000 [email protected]
iptablesは、テストのためにサーバーとローカルマシンの両方で一時的に停止されました。
私は何かが足りませんか?他のポートをローカルホストに転送する必要がありますか?それとも、何らかの形で名前解決が関係しているのでしょうか。
[〜#〜]編集[〜#〜]
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)
返される正確なEclipseエラーは次のとおりです。
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
これは、「use <lan|local ip address>
の代わりに <localhost>
"
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
久しぶりに答えています。私の特定のケースでは、解決策はEclipseJVMをリスニングモードにすることでした。
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に書き込まれたものはすべて、Eclipse JVMがリッスンしているH:8001に転送されます。
S上のTomcatJVMは、server = nで開始し、引数を指定する必要があります。
-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001
この記事 は、リモートJava仮想マシン(JVM)がデバッグモードでリッスンしているデフォルトのポートは1044であることを示しています。リモートが接続しているポートをトンネリングする必要がありますJVMも実行されています。
より一般的には、wireshark/tcpdumpを実行して、デバッガーの起動時にどのポート接続が試行されたかを確認できます。
[〜#〜]編集[〜#〜]:
私が試すもう少しのこと:
ps auxwww
など)で引数を確認します(-Xrunjdwp
の背後にあるものを探します。またはlsof -p PID_OF_JVM_TO_BE_DEBUGGED
でTCPリッスンするポート(TCP
出力でLISTEN
とlsof
の行を探します)lo
インターフェイスでリッスンしていることを確認してください(これは、sshの-L
オプションのlocalhost
で指定するものです)。jdb -attach localhost:8000
で起動するマシンでデバッガーを手動で起動することはできますか? (リモートホストでこれを試して、デバッガーがポート8000で実行されていることを確認することもできます)localhost
に接続しようとしていることを確認してください(-L
オプションを使用して最初の8000より前にバインドアドレスを指定しない場合、sshはlo
インターフェイスでリッスンします)リモートデバッグを行うときに、この問題が頻繁に発生しました。この問題の正確な理由はわかりませんが、以下の解決策を使用しました。おそらくそれはあなたにも役立つでしょう:
の代わりに
ssh -L 8000:localhost:8000 user@remotehost
使用されている
ssh -L 8000:remotehost:8000 user@remotehost
sSHトンネルを作成するため(2番目の例のポート番号間のlocalhostではなくremotehostに注意してください)。リモートホストの名前の代わりに、リモートホストの通常のIPアドレス(ループバックアドレス127.0.0.1ではなく、実際のローカルネットワークIPアドレス)を使用することもできます。
それがお役に立てば幸いです!
リモートTomcatインスタンスが-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
のようなもので開始されていると仮定して、次のコマンドを試してください。
ssh -L 8000:0.0.0.0:8000 [email protected] -N
Macで、ローカルでssh -L 10701:localhost:10700 user@localhost -N
を試しました。Tomcatインスタンスは-Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n
で開始され、Eclipse内のポート10701に接続しようとすると、「リモートへの接続に失敗しましたVM com.Sun.jdi.connect.spi.ClosedConnectionException "。tunnelコマンドをssh -L 10701:0.0.0.0:10700 user@localhost -N
に変更することで、Eclipseを接続できました。
-Xrunjdwpパラメーターの正確なパラメーターを教えてください。
また、デバッグのためにさまざまな方法(server = y/n、suspend = y/n)を試しましたか?
おそらく、接続を逆にする(デバッガーをTomcatに接続させるのではなく、Tomcatをデバッガーに接続させる)ことが役立つ場合があります。