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:
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
Dans la fenêtre qui vient de s’ouvrir, il faut maintenant cliquer sur le bouton “+”
IntelliJ: ajouter une configuration de debug
Dans le menu, choisir “Remote JVM 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
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?