gui*_*ido 27 java eclipse tomcat remote-debugging ssh-tunnel
在使用jpda启动tomcat之后,在我的公司,我可以在eclipse中远程调试一堆Web应用程序.出于多种原因,我现在需要从公司防火墙外部开发和远程调试这些相同的Web应用程序,我只能通过端口22上的ssh访问该服务器.
我将最需要的端口(svn,nexus,tomcat本身,从服务器或通过服务器)隧道传输到localhost,这些服务工作正常,但我无法以任何方式启动eclipse调试器; 我从第二次尝试开始时"等待数据包XXX"或"拒绝连接"时"连接超时".在服务器上检查nmap,它会在第一次连接尝试之前报告端口打开,然后在此之后关闭.我在catalina.out中没有有趣的输出日志
我用来启动隧道的命令是:
ssh -L 8000:localhost:8000 user@mycompany.com
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
之后:
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)
Run Code Online (Sandbox Code Playgroud)
返回的确切eclipse错误是:
Exception occurred during launch
Failed to connect to remote JVM. Connection timed out.
Timeout occurred while waiting for packet 204.
Run Code Online (Sandbox Code Playgroud)
(每次尝试时包数都不同).
在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.
Run Code Online (Sandbox Code Playgroud)
eclipse配置为直接互联网连接.
编辑2
我认为解决方案可能在这里:
http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/
但我在理解他的JNDI/RMI设置时遇到了一些麻烦,以及在多大程度上适用于我的配置.
编辑3
这是对那些回答"使用<lan|local ip address>而不是<localhost>"的人的澄清
B和C在同一网络基础设施中的两个不同的子网中; 只允许从外部连接到C端口22(并且有点"代理",我不知道网络内部).
A是"外部"(我的dsl连接动态IP地址).
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
Run Code Online (Sandbox Code Playgroud)
And*_*ner 10
本文建议远程Java虚拟机(JVM)在调试模式下侦听的默认端口是1044.您还应该隧道运行远程JVM的端口.
更一般地说,您可以运行wireshark/tcpdump来查看启动调试器时尝试进行的端口连接尝试.
编辑:
还有一些我会尝试的事情:
ps auxwww如果它是Linux的)与参数(找什么来背后-Xrunjdwp或lsof -p PID_OF_JVM_TO_BE_DEBUGGED在其上的TCP端口侦听(寻线,TCP并且LISTEN在lsof输出)lo接口,而不是网络接口(这是您localhost在-Lssh选项中指定的内容).jdb -attach localhost:8000?(您也可以在远程主机上尝试此操作以确保调试器在端口8000上运行)localhost(在第一个8000之前没有指定绑定地址,并且-Lssh选项在lo接口上侦听)我在进行远程调试时经常遇到这个问题.我不知道这个问题的确切原因,但我使用了下面的解决方案,也许它也适合你:
代替
ssh -L 8000:localhost:8000 user@remotehost
Run Code Online (Sandbox Code Playgroud)
用来
ssh -L 8000:remotehost:8000 user@remotehost
Run Code Online (Sandbox Code Playgroud)
用于创建SSH隧道(请注意第二个示例中端口号之间的remotehost而不是localhost).您也可以使用远程主机的普通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 user@mycompany.com -N
在我的Mac上,我在本地尝试了Tomcat实例,并尝试在Eclipse中的端口10701上附加,我一直看到"无法连接到远程VM com.sun.jdi.connect.spi.ClosedConnectionException".通过将tunnel命令更改为,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
好吧,我在很长一段时间后回答自己;在我的具体情况下,解决方案是将 Eclipse JVM 置于侦听模式:
Connection Type: "Standard (Socket Listen)"
Run Code Online (Sandbox Code Playgroud)
并反转隧道的方向:
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)
Run Code Online (Sandbox Code Playgroud)
一些解释:正如问题中一样,我的情况是:
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
Run Code Online (Sandbox Code Playgroud)
当像这样倒车时:
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
Run Code Online (Sandbox Code Playgroud)
成功了。换句话说,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16077 次 |
| 最近记录: |