Seer: front-end GUI para o GDB no Linux
(github.com/epasveer)- O Seer é um front-end para operar o GDB por meio de uma GUI no Linux e está em desenvolvimento ativo com o objetivo de oferecer uma GUI simples e visualmente agradável para o GDB
- A instalação pode ser feita por gerenciador de pacotes ou compilando do código-fonte, e os requisitos são Linux, C++17, GDB com suporte ao interpretador MI, CMake 3.5.0 ou superior e Qt6
- O Qt5 não compila mais a partir da árvore de código-fonte mais recente, e a árvore de código-fonte 2.3 é a última que pode ser compilada com Qt5, enquanto a v1.17 é o último release com Qt5
- O Seer oferece na GUI navegação de código-fonte, exibição de variáveis e registradores, gerenciamento de breakpoints, watchpoints, catchpoints e printpoints, visualização de pilha e threads, além de reverse debugging do GDB
- Recursos adicionais incluem visualização de assembly, visualização de memória, arrays, structs e imagens, além de um console de entrada e saída do programa em execução para lidar visualmente com o trabalho de depuração no GDB
Visão geral do projeto
- Seer é um front-end GUI do GDB para Linux
- O objetivo é fornecer uma GUI simples e visualmente agradável para o GDB
- O projeto está em desenvolvimento ativo, e bugs ou recursos desejados podem ser enviados por e-mail ou por issue no GitHub
Instalação e requisitos
- O Seer pode ser instalado por gerenciador de pacotes ou por compilação do código-fonte
- Requisitos:
- Linux
- C++17
- GDB com suporte ao interpretador
mi- Comando de verificação:
gdb --interpreter=mi
- Comando de verificação:
- CMake 3.5.0 ou superior
- Qt6
- Ao compilar do código-fonte, é necessário o pacote de desenvolvimento Qt6 apropriado para a distribuição
- Os módulos Qt6 necessários são Core, Gui, Widgets, PrintSupport, Charts e Svg
- Instruções de build com Qt6: Building Seer - Qt6
- Limitações relacionadas ao Qt5:
-
O Seer não compila mais com Qt5
- A árvore de código-fonte 2.3 é a última que pode ser compilada com Qt5
- Instruções de build com Qt5: Building Seer - Qt5
-
Caminhos de instalação por pacote
- Pamac no Manjaro:
pamac install seer
- zypper no openSUSE Tumbleweed:
zypper install seergdb
- Flathub:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- Versão beta em Flatpak:
- Seer release page
- Baixe
seer.flatpake instale - Para executar o GDB no
GDB Launcher, é necessárioflatpak-spawn --host
Releases e transição para Qt
- Você pode conferir novidades na Seer Wiki
- v1.17 é o último release com Qt5
- O próximo release é o v2.0, baseado em Qt6
- Por enquanto ainda é possível compilar com Qt5, mas, se você precisar do código-fonte Qt5 estável mais recente, deve usar v1.17
Forma de execução
- O Seer foi criado para facilitar o início do programa a ser depurado a partir da linha de comando
- Como o GDB oferece várias formas de dar suporte à depuração de programas, o Seer também oferece vários modos de execução
- Os métodos de execução podem ser vistos na wiki Starting Seer
Estrutura principal da GUI
-
Source/Function/Types/Variables/Libraries
- Mostra a lista de arquivos-fonte e arquivos de cabeçalho usados no programa
- Permite pesquisar funções, tipos e variáveis estáticas
- Um clique duplo abre o arquivo-fonte
- Mostra a lista de bibliotecas compartilhadas referenciadas pelo programa
- A lista de arquivos-fonte e de cabeçalho pode ser filtrada por busca
-
Variable/Register Info
- Exibe valores de variáveis e registradores
- O Logger registra os valores das variáveis
- O Tracker mostra os valores das variáveis especificadas sempre que o GDB atinge um ponto de parada, como step, next ou finish
- Registers mostra os valores de todos os registradores da CPU
-
Code Manager
- É a grande área central da GUI do Seer e mostra arquivos-fonte em abas
- É possível pesquisar texto no arquivo com
^F - Você pode dar clique duplo no nome de uma variável para adicioná-la ao Logger
CTRL+ clique duplo adiciona*antes da variávelSHIFT+ clique duplo adiciona&antes da variávelCTRL+SHIFT+ clique duplo adiciona*&antes da variável
- Pelo menu de clique direito, é possível adicionar a variável ao Tracker ou ao Memory Visualizer
- É possível criar um breakpoint ou printpoint em uma linha específica
- É possível executar até uma linha específica
- As abas podem ser destacadas com clique duplo
Controle de depuração e visualização do estado de execução
- A área inferior lida com breakpoints, watchpoints, catchpoints, printpoints, comandos manuais do GDB e logs
- Na aba de comandos manuais, você pode inserir diretamente comandos do GDB ou do GDB/MI
- Os comandos inseridos são lembrados para o próximo uso do Seer
- O Breakpoint manager cria e gerencia breakpoints
- O Watchpoint manager monitora acesso a variáveis
- É possível monitorar leitura, escrita ou leitura e escrita
- O Catchpoint manager interrompe a execução em chamadas
throw,rethrowecatchdo C++ - O Printpoint manager permite imprimir variáveis em pontos específicos, como o
dprintfdo GDB - GDB output registra a saída do próprio programa GDB
- Seer output registra a saída de diagnóstico do programa Seer
- Informações de stack frame:
- É possível mudar o escopo atual da função com clique duplo na lista de frames
- Mostra os argumentos de função de cada frame
- Mostra os valores das variáveis locais da função atual
- Informações de thread:
- Mostra a lista de IDs de todas as threads
- É possível mudar o escopo atual da thread com clique duplo no ID da thread
- Lista os stack frames de cada thread
- Suporta o modo de Reverse Debugging do GDB
- É possível ativar ou desativar o registro de comandos
- A direção da reprodução pode ser definida como forward ou reverse
Console e visualização de assembly
- O Seer Console mostra toda a saída de texto do executável
- A entrada de texto para o executável também pode ser feita no console
- Assembly View adiciona uma aba ao lado das abas de código-fonte para mostrar o assembly em execução no momento
- É ativada em
View->Assembly View - Também é possível definir breakpoints na aba de assembly
- A instrução atual é destacada
- Ao dar clique duplo em um item da aba Breakpoints ou Stack frames, o assembly daquele endereço é exibido
- Suporta atalhos
NextieStepi, normalmente com padrãoCtrl+F5eCTRL+F6 - Ao usar
^Fna aba de assembly, a barra de busca é exibida - Esse recurso de assembly é novo e aceita sugestões de mudanças e funcionalidades
- É ativada em
Ferramentas de visualização
-
Memory Visualizer
- Permite inspecionar conteúdo bruto de memória
- É possível visualizá-lo como memória e como disassembly
-
Array Visualizer
- Visualiza o conteúdo de arrays
- Oferece modos de exibição Normal, Spline e Scatter
- Dois arrays podem ser usados como gráfico X-Y
- O array de exemplo
pointsforma um contorno X-Y
-
Struct Visualizer
- Mostra o conteúdo de structs em C/C++ ou classes C++
- O exemplo mostra o conteúdo de
*thisda classe C++ atual - Membros de struct de tipos básicos podem ser editados
- Também existe o Basic Struct Visualizer, que é mais leve, mas não consegue seguir ponteiros nem permite edição
-
Image Visualizer
- Pode ser usado ao visualizar conteúdo bruto de memória que represente uma imagem
Suporte e contato
- Bugs ou solicitações de recurso podem ser enviados para
epasveer@att.netou registrados como issue no GitHub - Registrar issue: GitHub issues
1 comentários
Opiniões no Hacker News
Compilei no Linux junto com o Godot e usei um pouco; no geral é OK, mas a UI parece carregada demais de widgets e um tanto pouco polida
Alterar a fonte do editor não funcionou, e ao passar o mouse sobre uma variável para ver o valor, ou nada acontecia, ou o cursor mudava por um instante muito curto e então o GDB emitia um erro dizendo que tentou usar uma expressão contendo um tipo/palavra-chave
Dar duplo clique em uma variável adiciona o valor atual e um timestamp em algum painel, então a funcionalidade de ler valores/expressões pela UI existe, mas a implementação dos tooltips parece quebrada
Com um pouco mais de acabamento pode ficar útil, mas, entre os front-ends que já testei até agora, o que menos me desagradou foi o Gede. A UI é simples e intuitiva e, embora não tenha muitos recursos, os que ficam expostos tendem a funcionar bem, sem bugs: https://gede.dexar.se/
Para salvar a configuração de forma permanente, é preciso usar “Save Configuration...”. Também vou testar a exibição de valores ao passar o mouse sobre variáveis; se puder deixar bugs ou pedidos de recursos como issues no GitHub, seria ótimo
O GDB também tem uma interface de usuário em texto (TUI) embutida que é surpreendentemente fácil de usar. Ela até oferece suporte a interações com o 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 enableDepois de usar vários front-ends para GDB, acho que a TUI é a melhor opção. Quando o programa imprime saída e bagunça a interface, basta saber que
Ctrl + Lredesenha a telaEm
$XDG_CONFIG_HOME/gdb/gdbinit, deixo apenas istolayout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002E salvo o histórico assim
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboarde recomendo. Ele é parecido com a TUI, mas permite escolher vários tipos de informação para exibir, e as cores tornam a saída muito mais legívelTambém dá para mostrar o dashboard em outro terminal, ou dividi-lo entre vários terminais, o que permite criar disposições de janelas melhores. Antigamente fiz um script com tmux para gerar automaticamente a disposição dos terminais e conectá-los ao GDB; dá bastante trabalho, mas foi possível criar um layout bem bom
Ctrl + Lé algo obrigatório de saber em interfaces do tipo TUI, inclusive quando a tela do Vim fica corrompida. Depois que aprendi isso, inúmeros “crashes” misteriosos foram resolvidosMesmo quando você está conectado a um Linux a partir do Windows, ou usando WSL, é possível depurar remotamente processos Linux com WinDBG/VisualStudio
Isto é uma UI em Qt para GDB
Pelo que sei, também existe o gdbgui, uma UI baseada na web para GDB: https://www.gdbgui.com/
É sempre bom ver mais movimento em ferramentas de depuração
Ainda faltam vários recursos que podem ser essenciais para alguns usos. Isso porque meu modo de uso é principalmente depuração em nível de assembly, então eu não precisava de muitos recursos sofisticados
Dois anos atrás também houve uma discussão de porte médio: https://news.ycombinator.com/item?id=33044885
Se você usa Emacs, o GUD é uma integração com o GDB bastante boa
Não há motivo para continuar experimentando o novo editor do mês só porque ele adicionou alguns recursos meio de brinquedo. Colocando um plugin no Emacs, consigo o mesmo recurso e mantenho todo o resto do jeito que eu gosto.
Entrei de cabeça em programação na época do Atom, e fiquei bem triste quando o Atom desapareceu e virou o VS Code. O VS Code é bom, mas não segue a mesma filosofia do Atom.
Desde que aprendi Emacs há uns 4 anos, nenhuma ferramenta nova me convenceu dizendo “isso é tecnologia velha, você precisa trocar”. É um discurso aleatório e longo, mas sou muito grato por o Emacs continuar sobrevivendo.
M-x gdb, a GDB Graphical Interface do Emacs, aoM-x gud-gdb, que é a integração básica via GUD.Recentemente tive que mudar para o GUD para rodar o lldb, e senti falta das janelas dedicadas que mostram breakpoints, threads, a stack atual etc.
O bom do GUD é que a interface é consistente mesmo com depuradores diferentes. Assim, ao depurar Python com pdb e depois C++ com lldb, não preciso reaprender atalhos de teclado.
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
Usando com o debugpy, deixei de usar
M-x pdb, e a UI também é muito parecida comM-x gdb.lsp-mode+dap-modetambém funciona bem, mas é preciso mexer um pouco manualmente no arquivolaunch.json.Legal. Me lembra o DDD, que pareceu mágico quando vi pela primeira vez. Fico surpreso que o DDD ainda esteja sendo mantido.
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
Pelo que vi em anos de conversas, o DDD foi, paradoxalmente, uma ótima ferramenta de antimarketing, empurrando desenvolvedores para a UI de depuração embutida de suas IDEs favoritas. É verdade que o DDD em si é muito poderoso, mas até o “usabilidade é mais importante que estética” tem seus limites.
Depois que escrevi o texto, os mantenedores corrigiram os problemas que apontei, então agora não são necessárias tantas gambiarras. As versões 3.4.0 e 3.4.1 são lançamentos bem grandes.
Houve um projeto antigamente para portar para GTK3, mas parece que desapareceu. Ainda assim, fico feliz que o projeto principal continue seguindo em frente.
Ainda assim, parece que alguém o moveu para o GitHub, ressuscitou o projeto e fez um pouco de trabalho nele: https://github.com/antony-jr/insight
Encontrei o DDD quando estava procurando algo parecido com o dbxtool que eu usava nas máquinas antigas da Sun Microsystems. Hoje em dia o pessoal tem bastante luxo com coisas como depuração em nível de código-fonte.
O projeto GNU e o RMS parecem ser bastante ridicularizados como memes, mas o GDB é uma ferramenta poderosa. Eu só mexi um pouco diretamente, mas parece ter tido um impacto enorme no trabalho de desenvolvedores ao longo dos anos.
Há mais de 10 anos, quando eu escrevia C++ no Linux, usava o Qt Creator, que tinha um depurador integrado. Era um front-end para GDB, funcionava muito bem, e para C++ e Qt eu não via motivo para usar outra coisa.