- Seer es un frontend para manejar GDB con una GUI en Linux, y se desarrolla activamente con el objetivo de ofrecer una GUI simple y agradable para GDB
- Se puede instalar mediante gestor de paquetes o compilando desde el código fuente, y sus requisitos son Linux, C++17, GDB con soporte para el intérprete MI, CMake 3.5.0 o superior y Qt6
- Qt5 ya no compila en el árbol de código fuente más reciente, y el árbol de código fuente 2.3 es el último que puede compilarse con Qt5; v1.17 es la última versión publicada con Qt5
- Seer ofrece en la GUI navegación del código fuente, visualización de variables y registros, administración de breakpoints, watchpoints, catchpoints y printpoints, vista de pila e hilos, y GDB reverse debugging
- Como funciones adicionales, ofrece vista de ensamblado, visualización de memoria, arreglos, estructuras e imágenes, además de una consola de entrada/salida del programa en ejecución para tratar visualmente las tareas de depuración con GDB
Resumen del proyecto
- Seer es un frontend GUI de GDB para Linux
- Su objetivo es ofrecer una GUI simple y agradable para GDB
- El proyecto está en desarrollo activo, y los errores o funciones deseadas pueden enviarse por correo electrónico o mediante issues en GitHub
Instalación y requisitos
- Seer puede instalarse mediante gestor de paquetes o compilando desde el código fuente
- Requisitos:
- Linux
- C++17
- GDB con soporte para el intérprete
mi- Comando de verificación:
gdb --interpreter=mi
- Comando de verificación:
- CMake 3.5.0 o superior
- Qt6
- Al compilar desde el código fuente, se necesitan los paquetes de desarrollo de Qt6 correspondientes a la distribución
- Los módulos de Qt6 necesarios son Core, Gui, Widgets, PrintSupport, Charts y Svg
- Guía de compilación con Qt6: Building Seer - Qt6
- Restricciones relacionadas con Qt5:
-
Seer ya no compila con Qt5
- El árbol de código fuente 2.3 es el último que puede compilarse con Qt5
- Guía de compilación con Qt5: Building Seer - Qt5
-
Rutas de instalación por paquete
- Pamac en Manjaro:
pamac install seer
- zypper en openSUSE Tumbleweed:
zypper install seergdb
- Flathub:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- Versión beta en Flatpak:
- Seer release page
- Descargar e instalar
seer.flatpak - Para ejecutar GDB desde
GDB Launcher, se necesitaflatpak-spawn --host
Versiones y transición a Qt
- En la Seer Wiki se pueden consultar las novedades
- v1.17 es la última versión con Qt5
- La siguiente versión es v2.0 y está basada en Qt6
- Por ahora todavía puede compilarse con Qt5, pero si se necesita el código fuente estable más reciente con Qt5, hay que usar v1.17
Forma de ejecución
- Seer está hecho para iniciar fácilmente desde la línea de comandos el programa que se va a depurar
- Como GDB admite varias formas de depurar programas, Seer también ofrece varias formas de ejecución
- Los métodos de inicio pueden consultarse en la wiki Starting Seer
Estructura principal de la GUI
-
Source/Function/Types/Variables/Libraries
- Muestra la lista de archivos fuente y de encabezado usados en el programa
- Permite buscar funciones, tipos y variables estáticas
- Se puede abrir un archivo fuente con doble clic
- Muestra la lista de bibliotecas compartidas referenciadas por el programa
- La lista de archivos fuente y encabezado puede filtrarse mediante búsqueda
-
Variable/Register Info
- Muestra los valores de variables y registros
- Logger registra los valores de las variables
- Tracker muestra los valores de las variables especificadas cada vez que GDB llega a un punto de interrupción como step, next o finish
- Registers muestra los valores de todos los registros de la CPU
-
Code Manager
- Es el área grande central de la GUI de Seer y muestra archivos fuente en pestañas
- Se puede buscar texto dentro del archivo con
^F - Se puede agregar el nombre de una variable a Logger con doble clic
CTRL+ doble clic antepone*a la variableSHIFT+ doble clic antepone&a la variableCTRL+SHIFT+ doble clic antepone*&a la variable
- En el menú contextual se puede agregar la variable a Tracker o a Memory Visualizer
- Se pueden crear breakpoints o printpoints en una línea específica
- Se puede ejecutar hasta una línea específica
- Las pestañas pueden separarse con doble clic
Control de depuración y vista del estado de ejecución
- El área inferior maneja breakpoints, watchpoints, catchpoints, printpoints, comandos manuales de GDB y registros
- En la pestaña de comandos manuales se pueden introducir directamente comandos de GDB o GDB/MI
- Los comandos introducidos se recuerdan para la siguiente sesión de Seer
- Breakpoint manager crea y administra breakpoints
- Watchpoint manager supervisa el acceso a variables
- Puede vigilar lectura, escritura o lectura y escritura
- Catchpoint manager detiene la ejecución en llamadas a throw, rethrow y catch de C++
- Printpoint manager permite imprimir variables en puntos específicos, como
dprintfde GDB - GDB output registra la salida del propio programa GDB
- Seer output registra la salida de diagnóstico del programa Seer
- Información de stack frames:
- Se puede cambiar el alcance de la función actual con doble clic en la lista de frames
- Muestra los argumentos de función de cada frame
- Muestra los valores de las variables locales de la función actual
- Información de hilos:
- Muestra la lista de IDs de todos los hilos
- Se puede cambiar el alcance del hilo actual con doble clic en el ID del hilo
- Enumera los stack frames de cada hilo
- Admite el modo Reverse Debugging de GDB
- Se puede activar o desactivar el registro de comandos
- Se puede establecer la dirección de reproducción en forward o reverse
Consola y vista de ensamblado
- Seer Console muestra toda la salida de texto del ejecutable
- La entrada de texto para el ejecutable también puede introducirse desde la consola
- Assembly View agrega una pestaña junto a las pestañas del código fuente para mostrar el ensamblado que se está ejecutando actualmente
- Se activa desde
View->Assembly View - También se pueden establecer breakpoints en la pestaña de ensamblado
- La instrucción actual se resalta
- Al hacer doble clic en elementos de las pestañas Breakpoints o Stack frames, se muestra el ensamblado de esa dirección
- Admite los atajos
NextiyStepi, cuyos valores predeterminados suelen serCtrl+F5yCTRL+F6 - Si se usa
^Fen la pestaña de ensamblado, se muestra la barra de búsqueda - Esta función de ensamblado es nueva y se aceptan propuestas de cambios o de funciones
- Se activa desde
Herramientas de visualización
-
Memory Visualizer
- Permite revisar el contenido de la memoria en bruto
- Puede verse en forma de memoria y de desensamblado
-
Array Visualizer
- Visualiza el contenido de arreglos
- Ofrece modos de visualización Normal, Spline y Scatter
- Se pueden usar dos arreglos como gráfico X-Y
- El arreglo de ejemplo
pointsforma un contorno X-Y
-
Struct Visualizer
- Muestra el contenido de estructuras de C/C++ o clases de C++
- El ejemplo muestra el contenido de
*thisde la clase actual de C++ - Los miembros de estructura de tipos básicos pueden editarse
- También existe Basic Struct Visualizer, que es más ligero, pero no puede seguir punteros ni permite edición
-
Image Visualizer
- Puede usarse al ver contenido de memoria en bruto que corresponde a una imagen
Soporte y contacto
- Los errores o solicitudes de funciones pueden enviarse a
epasveer@att.neto registrarse como issues en GitHub - Registrar un issue: GitHub issues
1 comentarios
Opiniones de Hacker News
Lo compilé con Godot en Linux y lo usé un poco; en general está bien, pero la UI se siente sobrecargada de widgets y se ve algo poco pulida
Cambiar la fuente del editor no funcionó, y al pasar el mouse sobre una variable para ver su valor no pasaba nada, o el cursor cambiaba apenas por un instante y luego GDB arrojaba un error diciendo que intentó usar una expresión con un tipo/palabra clave
Hacer doble clic en una variable agrega el valor actual y una marca de tiempo a algún panel, así que la funcionalidad para leer valores/expresiones desde la UI existe, pero parece que la implementación del tooltip está rota
Con un poco de pulido podría ser útil, pero de los frontends que he probado hasta ahora, el que menos me disgustó fue Gede. La UI es simple e intuitiva, y aunque no tiene muchas funciones, las que expone suelen funcionar bien y sin bugs: https://gede.dexar.se/
Para guardar la configuración de forma permanente hay que usar “Save Configuration...”. También voy a probar la visualización del valor al pasar el mouse sobre variables; si puedes, deja bugs o pedidos de funciones como issues en GitHub
GDB también tiene una interfaz de usuario de texto (TUI) integrada que es sorprendentemente fácil de usar. Incluso soporta interacción con el mouse: 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 enableDespués de probar varios frontends para GDB, creo que la TUI es lo mejor. Si el programa imprime salida y rompe la interfaz, basta con saber
Ctrl + Lpara redibujarlaEn
$XDG_CONFIG_HOME/gdb/gdbinitsolo tengo estolayout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002Guardo el historial así
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboardy lo recomiendo. Es parecido a la TUI, pero permite elegir una gran variedad de información para mostrar y, gracias a los colores, la salida es mucho más fácil de leerTambién puedes mostrar el dashboard en otra terminal o repartirlo entre varias terminales para lograr una mejor disposición de ventanas. Hace tiempo escribí un script que generaba automáticamente una disposición de terminales con tmux y las conectaba a GDB; requiere bastante trabajo, pero se podía lograr un layout bastante bueno
Ctrl + Les algo que hay que saber sí o sí en entornos tipo TUI, incluso cuando se rompe la pantalla de Vim. Después de aprenderlo, se resolvieron montones de “crashes” misteriososIncluso si te conectas a Linux desde Windows o usas WSL, puedes depurar procesos Linux de forma remota con WinDBG/VisualStudio
Esto es una UI en Qt para GDB
Que yo sepa, también existe gdbgui, una UI web para GDB: https://www.gdbgui.com/
Siempre es bueno que haya más movimiento en herramientas de depuración
Todavía le faltan bastantes funciones que podrían ser imprescindibles para algunos usos. Es porque mi forma de usarlo es principalmente para depuración a nivel de ensamblador, así que no necesité muchas funciones sofisticadas
Hace 2 años también hubo una discusión de tamaño medio: https://news.ycombinator.com/item?id=33044885
Si eres usuario de Emacs, GUD es una integración bastante buena con GDB
No hay razón para seguir probando el editor nuevo del mes solo porque agregó algunas funciones de juguete. Pones un plugin en Emacs y obtienes lo mismo, mientras el resto se mantiene tal como me gusta.
Me metí de lleno en la programación en la época de Atom, y me dio bastante pena que Atom desapareciera y se convirtiera en VS Code. VS Code es bueno, pero no sigue la misma filosofía que Atom.
Desde que aprendí Emacs hace unos 4 años, ninguna herramienta nueva me ha convencido de que “esto es tecnología vieja y hay que cambiarse”. Es una divagación algo salida de la nada, pero de verdad agradezco que Emacs siga sobreviviendo.
M-x gdb, la GDB Graphical Interface de Emacs, por encima de la integración básica mediante GUD,M-x gud-gdb.Hace poco tuve que cambiarme a GUD para ejecutar lldb, y extrañé las ventanas dedicadas que muestran puntos de interrupción, hilos, la pila actual, etc.
Lo bueno de GUD es que la interfaz es consistente aunque cambie el depurador. Así que si pasas de depurar Python con pdb a depurar C++ con lldb, no tienes que volver a aprender atajos de teclado.
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
Al usarlo con debugpy, dejé de usar
M-x pdb, y la UI también es muy parecida aM-x gdb.lsp-mode+dap-modetambién funciona bien, pero hay que tocar bastante a mano el archivolaunch.json.Me gusta. Me recuerda a DDD, que me pareció mágico la primera vez que lo vi. Me sorprende que DDD todavía se mantenga.
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
Por años de conversaciones, DDD fue paradójicamente una gran herramienta de antimarketing, y terminó empujando a los desarrolladores hacia la UI del depurador integrada en su IDE favorito. Es cierto que DDD en sí es muy potente, pero incluso “la utilidad importa más que la estética” tiene sus límites.
Después de que escribí el artículo, los mantenedores corrigieron los problemas que señalé, así que ahora no hacen falta muchas de las soluciones alternativas. 3.4.0 y 3.4.1 son lanzamientos bastante grandes.
Antes había un proyecto para portarlo a GTK3, pero parece que desapareció. Aun así, me alegra que el proyecto principal siga adelante.
Aun así, parece que alguien lo movió a GitHub, lo revivió y trabajó un poco en él: https://github.com/antony-jr/insight
Encontré DDD mientras buscaba algo parecido a dbxtool, que usaba en antiguas máquinas de Sun Microsystems. La gente de hoy vive con bastante lujo gracias a cosas como la depuración a nivel de código fuente.
El proyecto GNU y RMS parecen recibir muchas burlas como si fueran memes, pero GDB es una herramienta poderosa. Solo lo he usado un poco directamente, pero parece haber tenido un impacto enorme en el trabajo de los desarrolladores durante años.
Hace más de 10 años, cuando programaba en C++ en Linux, usaba Qt Creator, que trae un depurador integrado. Es un frontend para GDB, funcionaba muy bien, y para C++ y Qt no veía razón para usar otra cosa.