Comment debugger un programme Java quand on ne peut pas faire tourner le serveur Web (TomEE ou Tomcat par exemple) dans son IDE?

TomEE, IntelliJ et remote debug

Introduction

Dans la version “Ultimate” d’IntelliJ, il est facile de configurer un serveur TomEE (ou Tomcat) et de débugger son application. Mais comment faire quand on dispose seulement de la version “Community”?

Remote Debug

C’est quoi le remote debug? C’est tout simplement la capacité des JVM à accepter qu’on inspecte le code et l’état mémoire (variables notamment). C’est une option pratique pour débugger en prod quand les logs ne sont pas suffisantes et qu’on ne peut pas déployer comme on le souhaite (voir ma galère avec Apache Struts).

Configuration

TomEE

Sous Linux, il faut ajouter le fichier setenv.sh dans le dossier d’installation de TomEE, comme ceci:

    
1nano /opt/tomee8/bin/setenv.sh

Le contenu du fichier est le suivant:

    
1!/bin/sh
2export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:8000"

le paramètre adress définit le nom (ou l’IP) du serveur qui héberge la JVM (ici localhost) ainsi que le port d’écoute du debugger (ici 8000).

Ensuite, il faut démarrer TomEE avec l’option “jpda”. Pour cela, j’ai modifié le script startup.sh comme ceci:

    
1nano /opt/tomee8/bin/startup.sh

J’ai remplacé la ligne

    
1exec "$PRGDIR"/"$EXECUTABLE" start "$@"

par

    
1exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

Note: Bien sûr, dans un environnement de production, il faudra absolument revenir au startup.sh initial dès lors qu’on aura résolu le problème.

IntelliJ

La configuration est très simple à mettre en œuvre, il faut d’abord ajouter la configuration grâce au bouton “Add configuration” (entre le marteau et le bouton “Run”).

IntelliJ: ajouter une configuration de debug

IntelliJ: ajouter une configuration de debug

Dans la fenêtre qui vient de s’ouvrir, il faut maintenant cliquer sur le bouton “+

IntelliJ: ajouter une configuration de debug

IntelliJ: ajouter une configuration de debug

Dans le menu, choisir “Remote JVM Debug

IntelliJ: ajouter une configuration de debug

IntelliJ: ajouter une configuration de debug

Dans la fenêtre de configuration, il faut saisir les quatre paramètres:

  • Name: le nom de la configuration (j’ai choisit TomEE)
  • Debugger mode: Attach to remote JVM
  • host: localhost (ou le hostname du serveur qui fait tourner la JVM)
  • Port: 8000

Note: il faut évidemment saisir les mêmes valeurs que dans le fichier setenv.sh

Tomcat, IntelliJ et remote debug

Tomcat, IntelliJ et remote debug

Cliquer sur le bouton “Ok”. Et voilà, c’est prêt!

Utilisation

Il suffit de démarrer cette configuration en mode Debug (le bug vert à côté du bouton “Run”). Ensuite, on peut ajouter des breakpoints comme pour n’importe quelle session de debug avec un serveur local. Magique, non?

Conclusion

La JVM fournit un mode debug qui est parfaitement exploité par IntelliJ et qui permet de debugger dans des situations très délicates. Pourquoi s’en passer?