3 puntos por GN⁺ 2024-11-16 | 1 comentarios | Compartir por WhatsApp
  • 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
    • 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:
  • Versión beta en Flatpak:
    • Seer release page
    • Descargar e instalar seer.flatpak
    • Para ejecutar GDB desde GDB Launcher, se necesita flatpak-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 variable
      • SHIFT + doble clic antepone & a la variable
      • CTRL+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 dprintf de 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 Nexti y Stepi, cuyos valores predeterminados suelen ser Ctrl+F5 y CTRL+F6
    • Si se usa ^F en 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

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 points forma un contorno X-Y
  • Struct Visualizer

    • Muestra el contenido de estructuras de C/C++ o clases de C++
    • El ejemplo muestra el contenido de *this de 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.net o registrarse como issues en GitHub
  • Registrar un issue: GitHub issues

1 comentarios

 
GN⁺ 2024-11-16
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/

    • Soy el autor de Seergdb. Me gustaría que explicaras más lo de que la configuración de la fuente del editor no funciona; en mis pruebas parece funcionar
      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
    • No quiero tener que lidiar también con bugs de la herramienta de depuración mientras busco bugs en mi código, así que me anoto Gede para probarlo la próxima vez que necesite depurar
  • 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...

    • Personalmente prefiero la línea de comandos antes que la TUI, pero puedes poner algo así en .gdbinit
      tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1
      tui layout default
      tui enable
    • La combinación Neovim + nvim-dap + nvim-dap-ui + gdb me resultó mucho mejor que eso
    • Lamentablemente, solo funciona si GDB fue compilado con soporte para TUI
  • Despué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 + L para redibujarla
    En $XDG_CONFIG_HOME/gdb/gdbinit solo tengo esto
    layout src
    set confirm off

    • Me gusta usar un prompt con color así
      set prompt \001\033[01;36m\002(gdb)\001\033[0m\002
      Guardo el historial así
      set history save on
      set history size 500000
      set history filename ~/.cache/gdb/history
    • Usé mucho gdb-dashboard y 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 leer
      Tambié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 + L es 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” misteriosos
    • gef soporta tmux, así que la salida del programa va a otro panel de tmux
    • El frontend gud-gdb dentro de Emacs es bastante cómodo y fácil de usar
  • Incluso si te conectas a Linux desde Windows o usas WSL, puedes depurar procesos Linux de forma remota con WinDBG/VisualStudio

    • ¿No basta con que del lado remoto esté corriendo gdbserver?
  • 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

    • Me gusta que en Qt Creator GDB funcione sin una configuración complicada. Pones unos breakpoints, le das a ejecutar y el IDE se encarga del resto
    • Para sumar otra opción a la lista de GUIs para GDB, también está una que hice yo: https://github.com/dzaima/grr
      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
    • También está DDD. Es un frontend en Motif
    • VS Code también tiene un frontend para GDB bastante bueno, y es especialmente útil al depurar microcontroladores embebidos
    • Ya que salió el tema de los depuradores web, hace poco hice un proyecto similar enfocado en depurar ensamblador x86-64: https://github.com/robalb/x86-64-playground
  • 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

    • Desde que apareció LSP, Emacs se siente mejor que todo lo demás. No hay motivo para irse. Sobre todo después de que se volvió más rápido con la compilación nativa.
      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.
    • Prefiero 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...
    • dape(https://github.com/svaante/dape#) es una buena opción para lenguajes que tienen un depurador que implementa el Debug Adapter Protocol.
      Al usarlo con debugpy, dejé de usar M-x pdb, y la UI también es muy parecida a M-x gdb.
    • lsp-mode + dap-mode también funciona bien, pero hay que tocar bastante a mano el archivo launch.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/

    • Aprendí DDD en la universidad hace 20 años, y ya entonces se sentía tosco. Ahora lo veo con mucha más indulgencia, pero Motif todavía me resulta molesto a la vista.
      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.
    • Claro que DDD está en mantenimiento. Escribí sobre sus funciones aquí: https://begriffs.com/posts/2022-07-17-debugging-gdb-ddd.html
      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.
    • Me gusta que DDD traiga incorporadas varias visualizaciones gráficas. En especial, siempre me pareció genial la función para visualizar estructuras de datos.
      Antes había un proyecto para portarlo a GTK3, pero parece que desapareció. Aun así, me alegra que el proyecto principal siga adelante.
    • A mí me recuerda a Insight, mi frontend favorito para GDB, que funcionaba bien en Windows en la época de cygwin. Lamentablemente, claramente ya no se mantiene: https://sourceware.org/insight/screenshots.php
      Aun así, parece que alguien lo movió a GitHub, lo revivió y trabajó un poco en él: https://github.com/antony-jr/insight
    • DDD es excelente. Todavía lo uso, pero soy un fósil.
      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.

    • Pregunta sincera: ¿por qué se burlan de GNU?
  • 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.