Débogage déclenché par JCmd, débogage déclenché par exception, et plus encore.
Le débogage est l’une des tâches les plus courantes dans le développement de logiciels, on peut donc supposer que toutes les fonctionnalités des débogueurs ont une couverture suffisante dans les tutoriels et les guides.
Pourtant, il existe trois joyaux cachés de l’agent de débogage Java (JDWP) qui vous permettent de retarder le début de la session de débogage jusqu’à…
- vous avez donné des ordres via jcmd (onjcmd=y option)
- le programme a lancé une exception spécifique (onthrow=)
- le programme a lancé une exception non prévue (onuncaught=y)
Demande d’option
Lorsqu’on débogue à distance dans notre IDE, la boîte de dialogue « Debug Configurations » nous indique quelles options on doit passer à notre JVM distant :
On peut ajouter d’autres options en les ajoutant à l’option -agentlib, ou en définissant la variable d’environnement _JAVA_JDWP_OPTIONS, qui est ajoutée par virgule aux options.
Toutes les options ne fonctionnent correctement qu’en mode serveur.
JCmd a déclenché le débogage
Il y a souvent des cas où le code qu’on veux déboguer est exécuté plus tard dans l’exécution de notre programme ou après un problème spécifique apparaît.
Donc, ne perdons pas de temps à exécuter la session de débogage depuis le début de notre programme, on va donc utilisé l’option onjcmd=y pour dire à l’agent JDWP d’attendre avec la session de débogage jusqu’à ce qu’elle soit déclenchée via jcmd :
jps est notre ami pour trouver l’ID de processus d’une JVM déjà en cours d’exécution.
Pour utiliser JCmd déclenché avec notre IDE, nous devons d’abord créer une configuration de débogage à distance (voir section précédente); nous pouvons ensuite démarrer le programme d’exemple dans le shell et déclencher le début de la session de débogage. Ensuite, nous démarrons la configuration de débogage à distance dans l’IDE et déboguerons notre programme :
Débogage déclenché par exception
Les sessions de débogage déclenchées par exception sont beaucoup plus anciennes que jcmd. Il existe deux types :
- Le lancement d’une exception spécifique (byte-code ou nom normal, classes internes avec $) peut démarrer la session de débogage en utilisant onthrow=. C’est particulièrement agréable si vous voulez déboguer la cause de cette exception spécifique. Cette fonctionnalité peut facilement être utilisée en combinaison avec votre IDE préféré.
- L’existence d’une exception non levée peut déclencher le démarrage d’une session de débogage en utilisant onuncaught=y. Le contexte de débogage est votre méthode principale la plus externe, mais il est toujours utile si vous souhaitez inspecter l’exception ou l’état de votre application. Un problème est que vous ne pouvez pas utiliser les débogueurs d’IntelliJ IDEA ou NetBeans pour explorer le contexte ; vous devez utiliser le débogueur jdb en ligne de commande à la place.
L’utilisation des deux types de déclencheurs est similaire au débogage déclenché par JCmd :
➜ java « agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005,onthrow=Ex,launch= exit » src/test/java/OnThrowAndJCmd.java
Sinon on peut le faire grâce à l’utilisation de jdb, on peut utiliser l’option de lancement pour appeler un script qui démarre jdb dans une nouvelle session tmux, dans notre cas, tmux_jdb.sh:
- #!/bin/sh
- tmux new-session -d -s jdb — jdb -attach $2
Nous exécutons notre application en utilisant l’agent JDWP avec l’option onthrow=Ex,launch=sh tmux_jdb.sh pour démarrer le jdb la première fois que l’exception Ex est levée et attachée à la session tmux :
Où nous pouvons examiner l’état actuel de la demande :
Aller dans main[1] permet de voir plus précisément l’état de la demande à l’instanté.
Conclusion
onthrow et onjcmd peuvent améliorer les performances du débogage à la demande, car cela nous permet de déclencher le début de la session de débogage à l’extérieur du débogueur