Debug d’un process node en prod

TL;DR Executer « kill -usr1 pid », « node inspect -p pid » et le debug mode (en ligne de commande) est à vous.

Récemment, j’ai eu besoin de débugger une app Node.js en production (un setTimeout qui ne fonctionne plus après 25 jours… Original). Seul problème: Comment faire des breakpoints et donc entrer en « mode debug » sur un process qui tourne déjà… Facile!

Commençons avec une app très simple qui affiche « Hello {name} » toutes les 2 secondes.

Pour le lancer en production, nous utilisons la commande « node index.js« .

Time to debug!

Première chose à faire, trouver le process

Ensuite, il faut le passer en mode debug. Pour ce faire, il faut le « killer » avec l’option -usr1 et le pid.

Si tout va bien, vous devriez voir ce message dans vos logs. Comme si vous aviez fait un console.log, donc au même endroit que vos « Hello {name} ».

Vu que mon port 9229 était fermé dans docker, j’ai préféré tout faire en ligne de commande. C’est un peu plus fastidieux, mais ça fonctionne bien!

La prochaine étape est d’écouter/inspecter le process en indiquant le même pid.

Vous devriez avoir un nouveau message dans vos logs:

Nous pouvons, dès à présent, commencer à rentrer dans le vif du sujet. On peut par exemple connaitre la liste des fichiers utilisés:

Ajouter des break points. Pour cela, il suffit d’indiquer le fichier et la ligne.

Attention, car vos fichiers seront légèrement différents que le fichier source que vous connaissez. Voici par exemple le fichier index.js tel que le node l’interprète:

Celui-ci est d’autant plus différent si vous utilisez « ts-node » par exemple. Au début, il faut donc un peu tâtonner pour arriver à la bonne ligne.

Après avoir mis le break point , votre app devrait rapidement arriver à la ligne demandée. Celle-ci se bloque, affiche un petit « > » sur la ligne « en cours », qui attend vos instructions. Les étoiles (*) correspondent à vos autres break points:

A présent, vous avez le choix:

« bt »: Afficher la backtrace:

« c »: Continuer l’exécution (jusqu’au prochain break point si vous en avez d’autres):

« n »: Aller à la prochaine instructions (La prochaine ligne):

« list(n) »: Afficher plus de lignes avant et après la ligne en cours:

« s »: « Entrer » dans la fonction où l’on se trouve (« o » pour en sortir). Vous allez même pouvoir entrer dans du code de node lui-même!

« exec »: Executer/Interpréter du code node « on the fly », dans le context actuel. Pratique pour connaître l’état des variables.

Il existe cependant quelques limitations. Par exemple « require » qui ne peut pas être appelé:

Et voilà, plus d’excuse maintenant! Si vous avez un bug en production, vous avez les outils pour trouver votre bug si vos logs sont incomplets ou si, comme moi, vous avez un problème avec une version de node en particulier 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *