Introduction
Si tu es développeur C, tu as probablement déjà rencontré un segfault (ou faute de segmentation). Ce classique des erreurs survient lorsque ton programme tente d'accéder à une mémoire interdite. Cependant, il peut arriver que ton programme plante sans afficher ce message d'erreur explicite. Alors, où est passé ton segfault ?
Le Mystère du Segfault Invisible
L'autre jour, en travaillant sur un petit programme C, j'utilisais entr pour surveiller les modifications de fichier et recompiler automatiquement. Malgré un segfault évident, rien n'apparaissait dans ma console. Après plusieurs tentatives, j'ai découvert que le problème venait de la manière dont bash gère les processus enfants.
Comprendre le Comportement de Bash
Lorsque tu exécutes une commande avec bash -c, si cette commande est la seule à exécuter, bash remplace le processus courant par la commande (exec). Cela optimise l'exécution mais a pour conséquence d'empêcher bash d'imprimer le message d'erreur lorsque le processus enfant meurt d'un segfault.
Solution 1 : Utiliser un Script Wrapper
Une des solutions consiste à encapsuler ta commande dans un script. En exécutant ce script avec entr, bash démarre un nouveau processus pour le script, ce qui permet d'afficher le message de segfault.
``bash #!/bin/bash gcc -o hello hello.c && ./hello ``
Solution 2 : Utiliser un Sous-shell
Une autre approche consiste à exécuter la commande dans un sous-shell en utilisant des parenthèses (). Cette méthode force bash à forker un nouveau processus, garantissant ainsi que le message de segfault s'affiche.
``bash ls hello.c | entr -s "gcc -o hello hello.c && (./hello)" ``
Solution 3 : Ajouter une Commande Après le Crash
Pour forcer bash à ne pas remplacer le processus, ajoute simplement une commande après celle qui pourrait planter. Par exemple, true est une commande qui ne fait rien, mais assure que bash reste le processus parent.
``bash ls hello.c | entr -s "bash -c 'gcc -o hello hello.c && ./hello; true'" ``
Conclusion
Bien que ces solutions puissent sembler des astuces, elles illustrent comment les subtilités des shells Unix peuvent affecter le débogage de tes programmes. La maîtrise de ces outils te permettra d'identifier plus rapidement les causes des erreurs et de les résoudre efficacement.
Discutons de ton projet en 15 minutes.