- Seer est un frontend permettant de piloter GDB via une interface graphique sous Linux, activement développé avec pour objectif de proposer une GUI simple et agréable pour GDB
- L’installation est possible via un gestionnaire de paquets ou en compilant depuis les sources, avec comme prérequis Linux, C++17, GDB avec prise en charge de l’interpréteur MI, CMake 3.5.0 ou plus récent, et Qt6
- Qt5 ne se compile plus avec l’arborescence source la plus récente ; l’arborescence 2.3 est la dernière compatible avec Qt5, et la v1.17 est la dernière version publiée sous Qt5
- Seer fournit dans son interface la navigation dans le code source, l’affichage des variables et registres, la gestion des breakpoints, watchpoints, catchpoints et printpoints, la vue pile et threads, ainsi que le reverse debugging de GDB
- Parmi les fonctions supplémentaires figurent la vue assembleur, la visualisation de la mémoire, des tableaux, des structures et des images, ainsi qu’une console d’entrée/sortie du programme, pour rendre le débogage GDB plus visuel
Aperçu du projet
- Seer est une interface graphique frontend pour GDB sous Linux
- Son objectif est de proposer à GDB une GUI simple et agréable à utiliser
- Le projet est activement développé, et il est possible de signaler des bugs ou de demander des fonctionnalités par e-mail ou via les issues GitHub
Installation et prérequis
- Seer peut être installé via un gestionnaire de paquets ou par compilation depuis les sources
- Prérequis :
- Linux
- C++17
- GDB avec prise en charge de l’interpréteur
mi- Commande de vérification :
gdb --interpreter=mi
- Commande de vérification :
- CMake 3.5.0 ou version ultérieure
- Qt6
- En cas de compilation depuis les sources, les paquets de développement Qt6 adaptés à la distribution sont nécessaires
- Les modules Qt6 requis sont Core, Gui, Widgets, PrintSupport, Charts et Svg
- Guide de compilation Qt6 : Building Seer - Qt6
- Limitations liées à Qt5 :
-
Seer ne se compile plus avec Qt5
- L’arborescence source 2.3 est la dernière à pouvoir être compilée avec Qt5
- Guide de compilation Qt5 : Building Seer - Qt5
-
Canaux d’installation par paquet
- Pamac sur Manjaro :
pamac install seer
- zypper sur openSUSE Tumbleweed :
zypper install seergdb
- Flathub :
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- Version bêta Flatpak :
- Seer release page
- télécharger puis installer
seer.flatpak flatpak-spawn --hostest requis pour lancer GDB depuisGDB Launcher
Versions et transition vers Qt
- Les nouveautés peuvent être suivies sur le Seer Wiki
- v1.17 est la dernière version publiée sous Qt5
- La version suivante est la v2.0, basée sur Qt6
- Pendant quelque temps, la compilation avec Qt5 reste possible, mais si vous avez besoin de la dernière base source stable sous Qt5, il faut utiliser v1.17
Mode de lancement
- Seer est conçu pour faciliter le démarrage du programme à déboguer depuis la ligne de commande
- Comme GDB prend en charge plusieurs façons de déboguer un programme, Seer propose lui aussi plusieurs modes de lancement
- Les méthodes de lancement sont décrites dans le wiki Starting Seer
Organisation de l’interface principale
-
Source/Function/Types/Variables/Libraries
- affiche la liste des fichiers source et d’en-tête utilisés dans le programme
- permet de rechercher les fonctions, types et variables statiques
- un double-clic permet d’ouvrir un fichier source
- affiche la liste des bibliothèques partagées référencées par le programme
- la liste des fichiers source et d’en-tête peut être filtrée par recherche
-
Variable/Register Info
- affiche les valeurs des variables et des registres
- Logger enregistre les valeurs de variables
- Tracker affiche les valeurs des variables choisies chaque fois que GDB atteint un point d’arrêt comme step, next ou finish
- Registers affiche les valeurs de tous les registres CPU
-
Code Manager
- grande zone centrale de l’interface Seer, affichant les fichiers source dans des onglets
^Fpermet de rechercher du texte dans le fichier- un double-clic sur un nom de variable permet de l’ajouter à Logger
CTRL+ double-clic ajoute*devant la variableSHIFT+ double-clic ajoute&devant la variableCTRL+SHIFT+ double-clic ajoute*&devant la variable
- le menu contextuel permet d’ajouter une variable à Tracker ou au Memory Visualizer
- permet de créer un breakpoint ou un printpoint sur une ligne donnée
- permet d’exécuter jusqu’à une ligne précise
- les onglets peuvent être détachés par double-clic
Contrôle du débogage et vue de l’état d’exécution
- La zone inférieure gère les breakpoints, watchpoints, catchpoints, printpoints, commandes GDB manuelles et journaux
- Dans l’onglet des commandes manuelles, il est possible de saisir directement des commandes GDB ou GDB/MI
- les commandes saisies sont mémorisées pour la prochaine utilisation de Seer
- Breakpoint manager permet de créer et gérer les breakpoints
- Watchpoint manager surveille les accès aux variables
- il peut surveiller la lecture, l’écriture ou lecture+écriture
- Catchpoint manager arrête l’exécution lors des appels C++ à throw, rethrow et catch
- Printpoint manager permet d’afficher des variables à un point précis, comme le
dprintfde GDB - GDB output enregistre la sortie du programme GDB lui-même
- Seer output enregistre la sortie de diagnostic du programme Seer
- Informations de pile d’exécution :
- un double-clic sur la liste des frames permet de changer le scope de la fonction courante
- affiche les arguments de fonction de chaque frame
- affiche les valeurs des variables locales de la fonction courante
- Informations sur les threads :
- affiche la liste de tous les identifiants de thread
- un double-clic sur un identifiant de thread permet de changer le scope du thread courant
- liste les stack frames de chaque thread
- Prend en charge le mode Reverse Debugging de GDB
- il est possible d’activer ou désactiver l’historique des commandes
- la direction de lecture peut être définie sur forward ou reverse
Console et vue assembleur
- Seer Console affiche toute la sortie texte du programme exécuté
- L’entrée texte destinée au programme peut également être saisie depuis la console
- Assembly View ajoute à côté des onglets source un onglet affichant l’assembleur en cours d’exécution
- s’active via
View->Assembly View - des breakpoints peuvent aussi être placés dans l’onglet assembleur
- l’instruction courante est mise en évidence
- un double-clic sur un élément des onglets Breakpoints ou Stack frames affiche l’assembleur à l’adresse correspondante
- prend en charge les raccourcis
NextietStepi, généralement définis par défaut surCtrl+F5etCTRL+F6 - utiliser
^Fdans l’onglet assembleur affiche une barre de recherche - cette fonction assembleur est récente et ouverte aux propositions de modification ou de nouvelles fonctionnalités
- s’active via
Outils de visualisation
-
Memory Visualizer
- permet d’inspecter le contenu brut de la mémoire
- permet une vue mémoire et une vue désassemblée
-
Array Visualizer
- visualise le contenu des tableaux
- propose les modes d’affichage Normal, Spline et Scatter
- peut utiliser deux tableaux comme tracé X-Y
- l’exemple du tableau
pointsforme un contour X-Y
-
Struct Visualizer
- affiche le contenu d’une structure C/C++ ou d’une classe C++
- l’exemple montre le contenu de
*thispour la classe C++ courante - les membres de structure de type de base peuvent être modifiés
- il existe aussi un Basic Struct Visualizer, plus léger mais incapable de suivre les pointeurs ou de modifier les valeurs
-
Image Visualizer
- peut être utilisé pour visualiser un contenu mémoire brut représentant une image
Support et contact
- Les bugs ou demandes de fonctionnalité peuvent être envoyés à
epasveer@att.netou signalés via les issues GitHub - Dépôt d’issue : GitHub issues
1 commentaires
Avis sur Hacker News
Je l’ai compilé avec Godot sous Linux et je l’ai utilisé un peu ; dans l’ensemble c’est correct, mais l’UI donne l’impression d’avoir trop de widgets et semble encore un peu brute
Le changement de police de l’éditeur ne fonctionnait pas, et quand je passais la souris sur une variable pour voir sa valeur, soit rien ne se passait, soit le curseur changeait très brièvement, puis GDB affichait une erreur disant qu’il avait essayé d’utiliser une expression contenant un type/mot-clé
Un double-clic sur une variable ajoute sa valeur actuelle et un horodatage dans un panneau, donc la fonctionnalité de lecture des valeurs/expressions existe bien dans l’UI, mais l’implémentation côté infobulle semble cassée
Avec un peu de finition, ça pourrait être utile, mais parmi les front-ends que j’ai essayés jusqu’ici, celui que j’ai le moins détesté est Gede. Son UI est simple et intuitive, et même s’il n’a pas énormément de fonctionnalités, celles qui sont exposées ont tendance à bien fonctionner sans bug : https://gede.dexar.se/
Pour enregistrer la configuration de façon permanente, il faut faire « Save Configuration... ». Je vais aussi tester l’affichage au survol des valeurs de variables ; ce serait bien de laisser les bugs ou demandes de fonctionnalités dans les issues GitHub
GDB dispose aussi, étonnamment, d’une interface utilisateur texte (TUI) intégrée assez facile à utiliser. Elle prend même en charge les interactions à la souris : https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.h...
.gdbinittui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1tui layout defaulttui enableAprès avoir essayé plusieurs front-ends pour GDB, je trouve que la TUI est ce qu’il y a de mieux. Quand le programme écrit de la sortie et casse l’interface, il suffit de connaître
Ctrl + Lpour la redessinerDans
$XDG_CONFIG_HOME/gdb/gdbinit, je ne mets que cecilayout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002Et j’enregistre l’historique comme ceci
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboardet je le recommande. C’est similaire à la TUI, mais on peut choisir bien plus finement les informations à afficher, et les couleurs rendent la sortie beaucoup plus lisibleOn peut aussi afficher le tableau de bord dans un autre terminal, ou le répartir sur plusieurs terminaux, ce qui permet de créer une meilleure disposition des fenêtres. À une époque, j’avais écrit un script pour générer automatiquement une disposition de terminaux avec tmux et les connecter à GDB ; ça demandait pas mal d’efforts, mais on pouvait obtenir un très bon layout
Ctrl + Lest indispensable à connaître dans les interfaces de type TUI, y compris quand l’écran de Vim est corrompu. Après l’avoir appris, j’ai résolu quantité de « crashes » mystérieuxMême lorsqu’on est connecté à Linux depuis Windows ou qu’on utilise WSL, on peut déboguer à distance des processus Linux avec WinDBG/VisualStudio
C’est une UI Qt pour GDB
À ma connaissance, il existe aussi gdbgui, une UI web pour GDB : https://www.gdbgui.com/
C’est toujours une bonne chose qu’il y ait davantage d’activité autour des outils de débogage
Il lui manque encore pas mal de fonctionnalités qui peuvent être indispensables pour certains usages. C’est parce que ma façon de l’utiliser relève surtout du débogage au niveau assembleur, donc je n’avais pas besoin de beaucoup de fonctionnalités sophistiquées
Il y avait déjà eu une discussion de taille moyenne il y a 2 ans : https://news.ycombinator.com/item?id=33044885
Si vous utilisez Emacs, GUD est une intégration GDB plutôt excellente
Aucune raison de continuer à essayer le nouvel éditeur du mois parce qu’il a ajouté quelques fonctionnalités gadget. Il suffit d’ajouter un plugin à Emacs pour obtenir la même chose, tout en gardant le reste exactement comme je l’aime
Je me suis vraiment mis au code à l’époque d’Atom, et j’ai été assez déçu qu’Atom disparaisse pour laisser place à VS Code. VS Code est bien, mais il ne suit pas la même philosophie qu’Atom
Depuis que j’ai appris Emacs il y a environ 4 ans, aucun nouvel outil n’a réussi à me convaincre que « c’est une vieille technologie, il faut passer à autre chose ». Digression sortie de nulle part, mais je suis vraiment reconnaissant qu’Emacs continue de survivre
M-x gdb, la GDB Graphical Interface d’Emacs, à l’intégration de base via GUD,M-x gud-gdbRécemment, j’ai dû repasser à GUD pour lancer lldb, et les fenêtres dédiées montrant les points d’arrêt, les threads, la pile courante, etc. m’ont manqué
Le bon côté de GUD, c’est que l’interface reste cohérente quel que soit le débogueur. Ainsi, quand on passe du débogage de Python avec pdb au débogage de C++ avec lldb, on n’a pas besoin de réapprendre les raccourcis clavier
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
En l’utilisant avec debugpy, je n’utilise plus
M-x pdb, et l’UI est aussi très proche deM-x gdblsp-mode+dap-modefonctionne bien aussi, mais il faut mettre un peu les mains dans le fichierlaunch.jsonSympa. Ça me rappelle DDD, qui m’avait semblé magique la première fois que je l’ai vu. Je suis surpris que DDD soit encore maintenu
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
À en juger par des années de discussions, DDD a paradoxalement été un excellent outil d’anti-marketing, poussant les développeurs vers l’UI de débogage intégrée de leur IDE préféré. DDD lui-même est certes très puissant, mais même « l’utilité prime sur l’esthétique » a ses limites
Après la publication de l’article, les mainteneurs ont corrigé les problèmes que j’avais signalés, si bien qu’il n’y a désormais plus besoin de beaucoup de contournements. 3.4.0 et 3.4.1 sont des versions assez importantes
Il y avait autrefois un projet de portage vers GTK3, mais il semble avoir disparu. Cela dit, je suis content que le projet principal continue
Cela dit, il semble que quelqu’un l’ait déplacé sur GitHub, l’ait relancé et ait fait un peu de travail dessus : https://github.com/antony-jr/insight
Je cherchais quelque chose de similaire à dbxtool, que j’utilisais sur d’anciennes machines Sun Microsystems, et je suis tombé sur DDD. Les gens d’aujourd’hui sont plutôt gâtés avec des choses comme le débogage au niveau source
Le projet GNU et RMS semblent souvent moqués comme des mèmes, mais GDB est un outil puissant. Je ne l’ai manipulé directement qu’un peu, mais il semble avoir eu un impact énorme sur le travail des développeurs pendant des années
Il y a plus de 10 ans, quand je faisais du C++ sous Linux, j’utilisais Qt Creator, qui avait un débogueur intégré. C’était un frontend GDB, il fonctionnait très bien, et pour C++ et Qt je ne voyais aucune raison d’utiliser autre chose