09 août 2012

Debug en production

Avec toute la bonne volonté du monde, on arrive parfois pas à reproduire un bug et il faut donc tapper sur la production pour analyser ce qui s'y passe.

Je suis tombé sur ce cas et j'ai donc du mettre en place un remote-debugger sur nos machines de production. Comme je risque de ne plus me rappeler la procédure la prochaine fois, voici un pense bête.

Etape 1 : mettre le workspace local dans l'état du code distant. Ca peut paraître bête, mais ce n'est pas une fois le debugger connecté qu'il faudra se rendre compte que les sources ne collent pas au runtime !

git checkout dev-at-cloud-1.447.2

Etape 2 : établir un tunnel SSH. J'avoue être totalement novice en la matière et avoir fait appel à
Google pour trouver la commande miracle, très bien expliquée par Korben.


ssh -i ~/.ssh/operations-ci.pem -L 5008:localhost:5005 root@10.192.xxx.xxx

######################################################################
Unauthorized access to this CloudBees system is forbidden and will
be prosecuted by law. By accessing this system, you agree that your
actions may be monitored if unauthorized usage is suspected.
######################################################################


Etape 3 : relancer l'instance en mode debug. Il ne semble pas possible de faire "passer" un JVM en mode debug après son lancement, même avec des API propriétaires de la JVM Sun/Oracle. C'est dommage, ce serait sacrément pratique.


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


Et enfin étape 4, lancement du remote debug depuis Idea.



Bon évidemment, à traverser l'atlantique pour debugger la production c'est pas ultra véloce, mais c'est nettement mieux que de rester planté devant les logs vierges ;)


Une autre option, que j'ai testé quelques fois et qui à l'avantage de ne pas souffrir de la distance qui sépare mon portable des datacenters Amazon : YouDebug

YouDebug utilise lui aussi le port de remote debugging, mais n'est pas interactif comme l'est un IDE. Il utilise des scripts Groovy pour définir les actions à réaliser sur un point d'arrêt. Il est ainsi possible de tracer le passage dans des méthodes, chopper le valeurs des paramètres et dumper la stack d'exécution courante. C'est évidemment moins confortable, mais c'est tout de même très pratique.