remote intellij for debug java eclipse tomcat remote-debugging ssh-tunnel

java - intellij - tomcat remote debugging



eclipse: depuración remota de un servidor tomcat detrás de un firewall (5)

Después de iniciar tomcat con jpda, mientras que en mi empresa puedo depurar remotamente un montón de aplicaciones web en eclipse. Por una serie de razones ahora necesito desarrollar y depurar a distancia esas mismas aplicaciones desde fuera del firewall de la empresa, y solo puedo acceder a ese servidor a través de ssh en el puerto 22.

Tunee la mayoría de los puertos necesarios (svn, nexus, tomcat mismo, del servidor o a través del servidor) a localhost y esos servicios funcionan bien, pero no puedo iniciar el depurador de eclipse de ninguna manera; Estoy obteniendo "tiempo de espera de conexión agotado mientras esperaba el paquete XXX" o "se rechazó la conexión" desde la segunda vez que lo intento. Comprobando con nmap en el servidor, informa que el puerto está abierto antes del primer intento de conexión, y se cierra después de eso. No obtengo ningún registro de salida interesante en catalina.out

El comando que uso para iniciar el túnel es:

ssh -L 8000:localhost:8000 [email protected]

iptables se detuvo temporalmente tanto en el servidor como en la máquina local para probar.

¿Me estoy perdiendo de algo? ¿Debo reenviar algún otro puerto a localhost? ¿O de alguna manera está involucrada la resolución del nombre?

EDITAR

Puertos abiertos antes del intento de conexión desde 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)

y después:

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)

error eclipse exacto devuelto es:

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

(el número de paquete varía en cada intento).

en workspace/.metadata/.log obtengo:

!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 está configurado para conexión directa a internet.

EDIT 2

Creo que la solución podría estar aquí:

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

pero tengo algunos problemas para entender su configuración JNDI / RMI, y en qué medida eso se aplica a mi configuración.

EDIT 3

Esta es una aclaración para aquellos que responden "use <lan|local ip address> lugar de <localhost> "

  • computadora A: mi estación de trabajo en la empresa
  • computadora B: mi estación de trabajo en casa
  • computadora C: servidor corriendo tomcat

B y C están en dos subredes diferentes en la misma infraestructura de red; solo se permiten las conexiones al puerto 22 de C desde el exterior (y de algún modo "proxy", no conozco las internas de la red).

A está "afuera" (mi conexión dsl con dirección IP dinámica).

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


¿Puede dar los parámetros exactos del parámetro -Xrunjdwp?

¿También ha probado diferentes métodos para la depuración (server = y / n, suspend = y / n)?

Tal vez la inversión de la conexión (permita que el tomcat se conecte al depurador en lugar de permitir que el depurador se conecte a tomcat) puede ayudar.


A menudo tuve este problema al realizar la depuración remota. No sé la razón exacta de este problema, pero utilicé la siguiente solución y quizás también funcione para usted:

en lugar de

ssh -L 8000:localhost:8000 user@remotehost

es usado

ssh -L 8000:remotehost:8000 user@remotehost

para crear el túnel SSH (observe el host remoto en lugar del localhost entre los números de puerto en el segundo ejemplo). En lugar del nombre del host remoto, también puede usar la dirección IP normal del host remoto (no la dirección de bucle invertido 127.0.0.1, sino la verdadera dirección IP de la red local).

Espero que ayude y buena suerte!


Bueno, me estoy respondiendo a mí mismo después de un largo tiempo; en mi caso específico, la solución fue poner eclipse JVM en modo de escucha:

Connection Type: "Standard (Socket Listen)"

e invertir la dirección del túnel:

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)

Alguna explicación: como en la pregunta, mi situación fue:

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

Mientras se invierte de esta manera:

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

Hizo el truco. En otras palabras, lo que está escrito en S: 8001, se reenvía a W: 8001, y lo que a su vez se escribe en W: 8001, se reenvía a H: 8001, donde está escuchando mi eclipse JVM.

La JVM de tomcat en S debe iniciarse con server = n, con argumentos:

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


Suponiendo que la instancia remota de Tomcat se haya iniciado con algo como -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n , pruebe este comando:

ssh -L 8000:0.0.0.0:8000 [email protected] -N

En mi Mac, probé ssh -L 10701: localhost :10700 user@localhost -N localmente, donde se inició una instancia de Tomcat con -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n , e intentando para conectar en el puerto 10701 dentro de Eclipse, seguí viendo "No se pudo conectar a VM remota com.sun.jdi.connect.spi.ClosedConnectionException". Al cambiar el comando de túnel a ssh -L 10701: 0.0.0.0 :10700 user@localhost -N , Eclipse fue capaz de conectarse.


Este artículo sugiere que el puerto predeterminado en el que la máquina virtual Java remota (JVM) está escuchando en modo de depuración es 1044. También debe realizar un túnel en el puerto en el que se ejecuta la JVM remota.

De forma más general, puede ejecutar wireshark / tcpdump para ver a qué puerto se realizan intentos de conexión al iniciar el depurador.

EDITAR :

Algunas cosas más que probaría:

  • compruebe el host remoto (por ejemplo, con ps auxwww si es Linux) con qué argumentos (busque lo que viene detrás -Xrunjdwp o con lsof -p PID_OF_JVM_TO_BE_DEBUGGED en qué puerto TCP escucha (busque las líneas con TCP y LISTEN en la salida lsof )
  • asegúrese de que la JVM en el host remoto escucha en la interfaz lo , no en la interfaz de red (eso es lo que especifica con el host localhost en la opción -L para ssh).
  • ¿Iniciar el depurador manualmente en la máquina donde comienza el eclipse con jdb -attach localhost:8000 ? (También puede probar esto en el host remoto para asegurarse de que el depurador se esté ejecutando en el puerto 8000)
  • asegúrese de que eclipse intente conectarse a localhost (cuando no se especifica una dirección de vinculación antes de los primeros 8000 con la opción -L ssh escucha en la interfaz lo )