Time Travel est la meilleure chose qui soit arrivée aux débogueurs depuis des décennies, mais il ne peut pas être utilisé avec Python.
Des sociétés telles qu’Undo ont développé un débogage avec Time Travel de qualité industrielle pour la plupart des langages couramment utilisés : C/C++, Java, Javascript, Go, C# et Rust, et même FORTRAN et COBOL, mais pour l’instant, il n’y a rien de natif pour Python. Il existe plusieurs débogueurs Python, mais aucun ne permet de voyager dans le temps.
Traditionnellement, les débogueurs permettaient aux développeurs de voir ce qu’un programme était en train de faire ; la nouvelle génération de débogueurs temporels leur permet de voir ce que le programme a fait, en revenant en arrière pour voir n’importe quelle ligne de code exécutée et n’importe quelle valeur de variable à n’importe quel moment de l’histoire, explique Magne Hov, ingénieur en logiciel chez Undo.
Les utilisateurs signalent que la capacité de débogage a été multipliée par 10, voire par 100. Il ne s’agit pas seulement d’être plus productif ; des bogues qui n’auraient jamais été corrigés auparavant le sont désormais, déclare Hov.
Il est également beaucoup plus facile de travailler sur une base de code inconnue.
- Outil de débogage des défauts non déterministes dans les processus multiples
- L’IDE et le débogueur facilitent le développement de logiciels automobiles
Le débogueur Python standard
Python est livré avec un débogueur appelé pdb qui permet aux développeurs d’interagir avec un programme en cours d’exécution – c’est-à-dire de voir en détail ce qu’il fait. L’utilisation de pdb est aussi simple que l’appel de la fonction intégrée breakpoint() pour obtenir une invite de débogage et, à partir de là, l’accès aux commandes pour évaluer les expressions, naviguer dans la pile d’appels, avancer dans le code et mettre en place des points d’arrêt conditionnels.
Les débogueurs comme pdb fonctionnent dans le même interpréteur Python que le programme en cours d’exécution. Cela facilite l’inspection et la manipulation des objets, car le débogueur peut évaluer directement les expressions et accéder aux modules de traceback et d’introspection de Python. Toutefois, cela exclut également certains flux de travail de débogage.
Les débogueurs temporels comme UDB et rr fonctionnent sur le principe de l’enregistrement d’un programme pendant qu’il s’exécute normalement, puis de la relecture de l’exécution tout en permettant à l’utilisateur de naviguer et d’inspecter l’état du programme à différents moments. Ils fonctionnent au niveau du processus – en rembobinant et en rejouant l’état de l’ensemble du processus Linux (ou Windows).
Pendant que le programme est rejoué, il doit suivre exactement le même chemin d’exécution que lorsqu’il a été enregistré, ce qui empêche un débogueur comme pdb d’exécuter au moment de la relecture des fonctions Python qui n’ont pas déjà été exécutées au moment de l’enregistrement.
- L’outil de traçage simplifie les tests et le débogage des logiciels
- Débogage efficace des MCU multicœurs
Techniquement, l’UDB permet d’exécuter de nouveaux chemins de code au moment de la relecture, mais ces exécutions sont isolées et tous les effets secondaires sont éliminés. Ainsi, même si nous pouvions exécuter du code à partir du module pdb, nous ne serions pas en mesure d’utiliser des fonctions telles que la définition de points d’arrêt.
Les crash dumps tels que les fichiers core ne sont pas non plus compatibles avec pdb, car il n’existe pas de processus réel dans lequel exécuter le code Python de pdb.
Un programme Python en cours d’exécution n’est en fin de compte qu’un processus, de sorte que le débogage d’un processus Python avec GDB (ou UDB) signifie en fait le débogage de l’interpréteur cpython.
Le débogueur ne connaît aucune des fonctions ou variables Python présentes dans un programme. Heureusement, le projet cpython gère une bibliothèque d’extensions GDB qui permettent à GDB de comprendre le code Python. La bibliothèque libpython.py sait comment inspecter les structures internes de cpython afin de présenter l’état du programme Python à l’utilisateur. La bibliothèque est exécutée par un interprète cpython à l’intérieur du processus de débogage, ce qui signifie qu’aucun code Python ne doit être exécuté dans le contexte du programme lui-même.
Comme l’interpréteur est implémenté dans le langage de programmation C, les informations de débogage DWARF doivent être disponibles pour l’exécutable Python pour que cela fonctionne, c’est-à-dire que l’exécutable Python doit avoir été compilé avec l’option -g du compilateur.
Le code pour le débogage se trouve sur github.com/undoio/python-debugging/tree/blog-post-2024-01-18 dans le fichier README.md. undo.io/udb-free-trial pour une version d’essai gratuite d’UDB avec un programme Python 3.10 d’exemple race.py qui contient quelques appels de fonctions simples ainsi qu’un problème de concurrence impliquant plusieurs threads.