Débogage à distance d'une application Java

254

J'ai une application Java exécutée sur une machine Linux. J'exécute l'application java en utilisant les éléments suivants:

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 depuis une machine Windows XP et j'essaye de me connecter à cette application. J'ai également ouvert le port dans Windows.

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?

dzidzitop
la source
Pas un double du tout. Tout d'abord, c'est une question plus ancienne. Deuxièmement, la réponse à cette question doit être indépendante de l'environnement de débogage.
Addison

Réponses:

476

Edit: J'ai remarqué que certaines personnes coupent et collent l'invocation ici. La réponse que j'ai donnée à l'origine ne concernait que le PO. Voici un style d'invocation plus moderne (y compris en utilisant le port plus conventionnel de 8000):

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

La réponse originale suit.


Essaye ça:

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

Deux points ici:

  1. Aucun espace dans l' runjdwpoption.
  2. Les options viennent avant le nom de la classe. Tous les arguments que vous avez après le nom de la classe sont des arguments pour votre programme!
Chris Jester-Young
la source
2
@DJGummikuh Nice! J'ai mis à jour l'article pour utiliser l' -agentliboption de style plus récent pour votre plaisir de couper et coller. :-)
Chris Jester-Young
Avons-nous toujours besoin que le code source de l'application distante soit présent sur la machine où nous effectuons le débogage à distance?
MasterJoe2
Vous devez connaître le code source. Soit vous avez les fichiers .java, soit vous avez les fichiers .jar / .class combinés avec le décompilateur. Un IDE tel qu'Eclipse peut avoir un décompilateur tel que JDecompiler installé afin que vous puissiez déboguer le fichier .class comme s'il s'agissait d'un fichier .java (à l'exclusion des commentaires).
Iwan Satria le
1
Il vaut la peine de répéter un commentaire de ce stackoverflow.com/a/138518/500902 , "Puisque Java 9" adresse = 1044 "n'écoute pas toujours sur toutes les interfaces." Adresse = *: 1044 "fait que Java 9+ se comporte comme Java 8" pour permettre le débogage à partir d'un hôte différent
Marvin
84

Pour JDK 1.3 ou 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 les nouveaux JDK:

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

Veuillez modifier le numéro de port en fonction de vos besoins.

De Java Technotes

À partir de la version 5.0, l'option -agentlib: jdwp est utilisée pour charger et spécifier des options pour 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 dans 5.0 utilise l'interface JVM TI pour la machine virtuelle plutôt que l'ancienne interface JVMDI)

Une dernière chose à noter, dans la documentation de l'interface de JVM Tool :

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

Sairam Krish
la source
Les éléments suivants fonctionnent avec les paramètres par défaut d'Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae
29

Pas:

  1. Démarrez votre application Java à distance avec des options de débogage comme indiqué dans le post ci-dessus.
  2. Configurez Eclipse pour le débogage à distance en spécifiant l'hôte et le port.
  3. Démarrez le débogage à distance dans Eclipse et attendez que la connexion réussisse.
  4. Configurez le point d'arrêt et le débogage.
  5. Si vous souhaitez déboguer depuis le début de l'application, utilisez suspend = y, cela maintiendra l'application distante suspendue jusqu'à ce que vous vous connectiez depuis eclipse.

Voir le guide étape par étape sur le débogage à distance Java pour plus de détails.

Gaurav
la source
16

Réponse couvrant Java> = 9:

Pour Java 9+, l'option JVM nécessite un léger changement en préfixant l'adresse avec l'adresse IP de la machine hébergeant la JVM, ou simplement *:

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

Cela est dû à un changement noté dans https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

Pour Java <9, le numéro de port est suffisant pour se connecter.

M Anouti
la source
8

Je voudrais souligner que l' ordre des arguments est important .

Pour moi, la java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarcommande ouvre le port du débogueur ,

mais la java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000commande ne le fait pas .

Mr Noir
la source
3
Je suppose que c'est parce que dans votre deuxième exemple, tout ce qui suit "app.jar" est passé comme arguments dans votre méthode principale
xoX Zeus Xox
@xoXZeusXox ha ha. Oui, il est passé en argument. Merci d'avoir mentionné.
MrBlack
1

Voici comment configurer le débogueur Eclipse pour le débogage à distance:

Paramètres Eclipse:

1.Cliquez sur 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-portlet
  • Type de connexion: Socket Attach
  • Propriétés de connexion: i) localhost ii) 8787

Pour JBoss:

1.Changez le /path/toJboss/jboss-eap-6.1/bin/standalone.confdans 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 le fichier catalina.bat :

É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: exécutez Tomcat à partir de l'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 souhaitez déboguer.

Pritam Banerjee
la source
Dans Java 8, le JDK prend en charge une variable d'environnement JAVA_TOOL_OPTIONS afin d'activer le débogueur pour toute application Java que vous devez utiliser: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps désolé pour les modifications, combat avec le formateur.
Nathan Niesen