2009-06-10 8 views
188

J'ai une application Java s'exécutant sur une machine Linux. Je lance l'application Java en utilisant ce qui suit:Débogage à distance d'une application Java

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

J'ai ouvert le port 4000 pour TCP sur cette machine Linux. J'utilise eclipse à partir de la machine Windows XP et j'essaie de me connecter à cette application. J'ai ouvert le port dans les fenêtres aussi.

Les deux machines sont sur le LAN mais je n'arrive pas à connecter le débogueur à l'application Java. Qu'est-ce que je fais mal?

+0

Quelle erreur obtenez-vous? – Glen

+0

https://stackoverflow.com/a/46171836/1619407 –

Répondre

387

Editer: J'ai remarqué que certaines personnes coupent et collent l'invocation ici. La réponse que j'ai donnée à l'origine était pertinente pour le PO seulement. Voici un style d'appel plus moderne (y compris en utilisant le port plus classique de 8000):

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

réponse originale suit.


Essayez ceci:

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

Deux points ici:

  1. Pas d'espace dans l'option runjdwp.
  2. Les options sont précédées du nom de la classe. Tous les arguments que vous avez après le nom de la classe sont des arguments pour votre programme!
+5

[Documentation JDPA officielle de connexion et d'invocation] (http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html# Invocation) –

+2

@DJGummikuh Nice! J'ai mis à jour la publication pour utiliser l'option '-agentlib' de style plus récent pour votre plaisir de couper-coller. :-) –

+0

Avons-nous toujours besoin que le code source de l'application distante soit présent dans la machine sur laquelle nous effectuons le débogage à distance? – testerjoe2

26

Étapes:

  1. Lancez votre application java à distance avec des options de débogage comme dit ci-dessus. En post
  2. Configurez Eclipse pour le débogage distant en spécifiant l'hôte et le port.
  3. Démarrez le débogage distant dans Eclipse et attendez que la connexion aboutisse.
  4. Point d'arrêt d'installation et débogage.
  5. Si vous voulez déboguer à partir du début de l'application, utilisez suspend = y, cela suspendra l'application distante jusqu'à ce que vous vous connectiez depuis eclipse.

Voir Step by Step guide on Java remote debugging pour plus de détails.

65

Pour JDK 1.3 ou une version antérieure:

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

Pour JDK 1,4

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

Pour JDK plus récent:

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

S'il vous plaît changer le numéro de port en fonction de vos besoins.

De java technotes

De 5.0 à partir de l'option -agentlib: jdwp est utilisée pour charger et spécifier les options à l'agent JDWP. Pour les versions antérieures à 5.0, les options -Xdebug et -Xrunjdwp sont utilisées (l'implémentation 5.0 prend également en charge les options -Xdebug et -Xrunjdwp, mais la nouvelle option -agentlib: jdwp est préférable car l'agent JDWP de 5.0 utilise l'interface TI JVM à la VM plutôt que l'interface JVMDI plus)

Une chose à noter, à partir JVM Tool interface documentation:

JVM TI a été introduite à JDK 5.0. JVM TI remplace l'interface JVMPI (Java Virtual Machine Profiler Interface) et l'interface Java Virtual Machine Debug (JVMDI) qui, à partir du JDK 6, ne sont plus fournies.

+0

Ce qui suit fonctionne avec les paramètres par défaut d'Eclipse: -agentlib: jdwp = transport = dt_socket, serveur = y, adresse = 8000 – Sundae

0

Voici comment vous devez configurer Eclipse Debugger pour le débogage à distance:

Réglages Eclipse:

1.Click le bouton Exécuter
2.Sélectionnez les configurations de débogage
3 .Sélectionnez "Application Java distante"
4. Nouvelle configuration

  • Nom: GatewayPortalProject
  • Projet: GatewayPortal portlets
  • Type de connexion: Socket Attach
  • Propriétés de connexion: i) localhost ii) 8787

Pour JBoss:

1.Changer le /path/toJboss/jboss-eap-6.1/bin/standalone.conf dans votre vm comme suit: Décommentez la ligne suivante en supprimant le #:

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

Pour Tomcat:

Dans catalina.bat fichier:

Étape 1:

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

Étape 2:

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

Étape 3: Lancez Tomcat invite de commande comme ci-dessous:

catalina.sh jpda start 

Ensuite, vous devez définir des points d'arrêt dans les classes Java que vous désirez déboguer.

-3

La meilleure option de débogage consiste à créer des journaux et à analyser les journaux. Mais dans certains cas, nous devons déboguer l'application web déployée sur le serveur.

Voir Remotely debug a java web application lien. Le déroulement complet du débogage à distance est décrit ici. J'espère que ça va aider.

+1

Sérieusement? Pour analyser un flux de requêtes, je vais activer la journalisation pour toutes les demandes, les déployer et passer en revue les Go de journaux. –

+0

Je vous ai fourni la manière alternative de déboguer l'application Spring MVC et oui, la journalisation est le meilleur moyen de déboguer l'application distante. Si vous avez une meilleure option, veuillez me le faire savoir afin que nous puissions l'utiliser à l'avenir ... –

Questions connexes