Apesar da depuração em modo texto ser bastante poderosa e educacional, a escrita manual de cada comando rapidamente se torna chata. Para facilitar um pouco a tarefa do depurador (humano, entenda-se!), foram desenvolvidzs várias interfaces gráficas para o GDB. Uma interface gráfica, ou GUI (Graphical
User Interface), permite-lhe ver o código fonte sem ter de executar o comando list, e mantém constantemente atualizados os valores das variáveis, registros e pilhas sob observação. De igual forma, os pontos de parada são também apresentados de forma bastante clara, juntamente com a instrução atualmente em execução no programa. São muitos os GUIs disponíveis, mas nem todos são adequados para a depuração de programas numa placa com microcontrolador. As duas interfaces gráficas mais utilizadas são o Eclipse e o Insight. O Eclipse é uma poderosa e sofisticada plataforma integrada gratuita. Através da adição de um plug-in (ou suplemento), pode também ser utilizada como um GUI para o GDB. Mas o processo de configuração é algo complicado, sendo que vamos começar por explorar o Insight, um GUI criado e educado para o GDB.
O Insight é uma aplicação de Linux gratuita e open-source, suportada pela Red Hat. Como tal, não é fácil compilar este programa em Windows, e pior ainda, é muito difícil encontrar um executável Insight pré-compilado para Windows. Portanto, esta é provavelmente razão suficiente para abandonarmos esta rota e tentarmos outra alternativa. Afinal, porquê prosseguir com o Insight? Bem, porque uma vez que você se familiarize com o Insight, vai descobrir que este é um programa bastante interessante. Trata-se efetivamente de uma prática ferramenta de depuração, sem opções inúteis ou desnecessárias. De fato, uma análise mais cuidada levou-nos a descobrir uma versão do executável do Insight para Windows no WinARM, a tool apropos Permite-lhe procurar ajuda sobre uma dada primitiva (keyword).
backtrace (bt) Mostra a posição de execução atual de acordo com a pilha.
break (b) ativar um ponto de parada, por exemplo, break main.
clear apagar um ponto de parada.
continue (c) Continuar a execução do programa. <ctrl><c> permite interromper o programa.
delete (d) apaga um, vários ou todos os pontos de parada.
finish termina a subrotina atual.
help (h) Mostra a ajuda do gdb. help seguido de um comando permite-lhe obter ajuda sobre esse mesmo comando, por exem-plo, help print.
info (i) apresenta informação adicional sobre algo. deve ser seguido por um parâmetro, como info sources, para apresentar a lista de arquivos de código fonte utilizados pelo programa.
list (l) Permite-lhe visualizar um dado número de linhas (normal = 10) do código fonte.
next (n) executa a linha seguinte de código sem entrar no interior de uma subrotina, isto é, a chamada à subrotina é tratada como uma única linha de programa. a subrotina é portanto executada.
print (p) Mostra o valor de uma variável ou registro.
quit (q) termina o GdB.
run (r) executa o programa a partir do início.
set Permite-lhe ativar ou desativar uma opção do GdB.
show Mostra o estado de uma opção do GdB. Se for chamado sem parâmetros apresenta o valor de todas as opções.
step (s) executa a próxima linha. entra no interior das subrotinas.
until Continua a execução até alcançar uma certa linha ou subrotina: until toto é equivalente a break toto ; continue.
watch Para a execução do programa quando se verificar a condição especificada.
where Consultar a lista de chamadas até então (backtrace).
<ctrl><c> força o GdB a terminar a execução do programa sob depuração.
<enter> repete o último comando.
do Yagarto também o incluem, exceto aparentemente a mais recente.
Ao contrário do Eclipse, o Insight tem uma versão do GDB embutida, sendo que se já tiver o Insight não é necessário instalar também o GDB. Em alguns aspectos a ferramenta funciona efetivamente como um GDB gráfico. Por exemplo, o Insight lê o mesmo arquivo de comandos inicial (.gdbinit) que o GDB. Se o script estiver correto (o Insight é um pouco minuciosa, e em alguns comandos é obrigatório seguir a ordem pré determinada, o depurador é lançado e a linha de código onde o programa parou a sua execução é convenientemente assinalada (através de uma cor de fundo distinta), isto claro, se tiver sido previamente configurado um breakpoint. Note que é estritamente necessário lançar o OpenOCD, conforme descrito anteriormente, antes de lançar o Insight.
Na janela principal (Source Window, Figura 6) tem acesso a janelas adicionais para apresentação de variáveis locais, registros, pilha, memória, breakpoints e o console GDB. À medida que avança na execução do seu programa, as janelas são atualizadas pelo software, e as alterações mais recentes são sempre assinaladas. Este é, sem dúvida, um processo muito mais prático do que a escrita do comando print após cada passo (step).
Para que o GUI possa atualizar toda a informação apresentada este tem de efetuar várias transações JTAG por cada comando executado. Se a sua ponta de prova JTAG não for particularmente rápida, o processo pode tornar-se lento, daí o interesse em adquirir uma ponta de prova suficientemente rápida.
O console GDB do Insight permite-lhe executar exatamente os mesmos comandos que anteriormente no GDB, isto é, comandos em modo texto, com a diferença que os resultados são agora apresentados em outras janelas. O acesso direto à janela GDB é bastante prático quando se perde o controle do programa em depuração, tornando-se necessário executar comandos desconhecidos do Insight (por exemplo, monitor reset).
Por vezes sucede que uma determinada operação leva à perda da conexão entre o GDB e o OpenOCD sem que se dê conta disso, por exemplo ao carregar um novo arquivo para depuração. Assim, é importante manter debaixo de olho a janela do OpenOCD, para garantir que a conexão permaneça ativa.
Antes de acabar esta seção, importa fazer alguns comentários gerais:
• No nosso computador de teste, ao lançar a cópia do Insight incluída no WinARM aparece uma mensagem de aviso Unknown ARM EABI version 0x5000000. Ignoramos o aviso, e aparentemente a ferramenta funcionou sem problemas. Se souber onde se pode encontrar uma versão mais recente do Insight já compilada para Windows, envie-nos uma mensagem.
• A Figura 7 mostra como configurar o Insight manualmente (File
→ Target Settings…).
Melhor
O Insight é por si só uma ótima ferramenta para a depuração de uma aplicação numa placa com microcontrolador, mas há melhor. O Eclipse (consulte acima) é um ambiente de desenvolvimento integrado, ou IDE (Integrated Development Environment) com tudo quanto possa querer, escrito em Java, e que lhe permite não só depurar uma aplicação mas também editar código fonte, iniciar o processo de compilação, e lançar outras ferramentas e software, tudo a partir de um mesmo
ambiente. Mas há um preço a pagar por todo este luxo: é difícil instalar um ambiente Eclipse sem consultar vários sites, uma vez que o Eclipse é uma IDE genérica repleta de opções (muitas vezes incompreensíveis) para satisfazer as opções de todos. Assim, não vamos detalhar aqui todos os passos necessários, mas antes reencaminhá-lo para o site do Yagarto [5], por exemplo, onde existe um guia bastante detalhado com uma explicação de todo o processo. Note que não basta instalar o Eclipse, sendo também necessário instalar o suplemento CDT (C/C++ Development Toolinng) que converte o Eclipse numa IDE para o desenvolvimento de software em C/C++, e adiciona a funcionalidade necessária para depuração de código neste ambiente.
Uma vez que o Eclipse/CDT esteja instalada, execute-a. É-lhe imediatamente pedido que escolha uma localização para a área de trabalho (workspace), isto é, a pasta onde o Eclipse irá guardar os seus projetos. Uma vez que já dispomos do código fonte
figura 6. o Insight é uma interface gráfico para o GdB.
figura 7. Parâmetros para o Insight que garantem um bom funcionamento.
Existing Code. Na nova janela que entretanto se abre navegue até ao código já existente (Existing Code Location), e mude o nome do projeto (Project Name) se necessário. Nas configurações do indexador (Toolchains for Indexer Settings) selecione <none>, e verifique a linguagem de programação utilizada. Carregue por fim no botão Finish para concluir a importação.
O Eclipse oferece vários tipos de vistas de projeto distintas, chamadas Perspectives. Por omissão o editor abre a vista Resource, mas estamos interessados na vista C/C++ (Window → Open Perspective → Other…). Pode fechar a vista Resource, eliminando assim esse botão adicional no seu IDE.
Para testar o seu projeto juntamente com a instalação do Eclipse, pode-se tentar fazer um make clean (Project → Clean…), seguido por um make all (Project → Build Project). O Eclipse/CDT assume que as ferramentas de compilação e o GDB estão presentes em algum lugar no seu computador. Pode indicar o caminho para o GDB, mas o make deve ser capaz de o encontrar através da variável global do Windows path. Se utilizar várias cadeias de compilação distintas (WinARM, Yagarto e outras), o processo mais simples passa pela utilização de uma makefile para cada uma delas.
Se ambos os testes decorrerem sem problemas, é hora de avançar para a fase de depuração. Tal como anteriormente, deve começar por executar o OpenOCD antes de iniciar o processo de depuração.
O Eclipse permite a configuração de ferramentas externas (Run → External Tools → External Tools Configurations…), sendo que pode lançar o OpenOCD diretamente no IDE; mas pode, claro, continuar utilizando a linha de comando como anteriormente.
Abra a vista de depuração Debug. O depurador deve ser configurado antes da primeira utilização. Pode acessar à configuração de depuração através do menu Run → Debug Configurations ou através da pequena seta à direita do botão de Debug (o que tem um pequeno escaravelho). Selecione GDB Hardware Debugging e carregue no botão New (a página em branco com um pequeno +). São apresentados três separadores para indicar: Main, Debugger e Startup. Consulte as Figuras 8, 9 e 10 para descobrir como configurar o seu depurador. Todos os parâmetros não apresentados nestas figuras mantêm os seus valores originais. Note que o separador Startup contém uma janela onde pode introduzir os comandos a serem executados na inicialização do GDB. Estes são os mesmos comandos indicados anteriormente, tradicionalmente colocados no arquivo .gdbinit.
Lance o depurador. Se esta for a primeira vez que o executa para o projeto atual, o Eclipse não inclui o projeto nas hipóteses apresentadas, sendo que deve começar por configurar o depurador carregando no botão Debug. Nas próximas vezes o Eclipse já propõe o projeto assim que carregar no botão com o escaravelho. Assim que o Eclipse esteja corretamente configurada obtém então uma vista de depuração semelhante à da Figura 11. É altamente recomendável a utilização de um monitor de grandes dimensões, uma vez que o Eclipse oferece várias janelas e vai precisar de espaço para as apresentar todas. No canto inferior esquerdo desta figura pode encontrar o console GDB, onde pode escrever por comandos GDB que prefira introduzir por si próprio [o Eclipse desativa o cursor (gdb)]. Não se deixe distrair por todos os botões, ícones e separadores que decoram as janelas, concentre-se sobretudo no conteúdo de cada janela.
Pode percorrer o seu programa utilizando os botões F5, F6 e F7, e figura 9. Segundo separador; tenha em atenção a última linha
Using Standard GdB Hardware debugging Launcher.
figura 10. terceiro separador; os parâmetros na parte de baixo deste separador (acessível pela barra de deslocamento à direita)
estão em branco (por omissão).
figura 8. Configuração do depurador do eclipse, primeiro separador.
selecione-as em Window → Show View.
Tal como na seção do Insight, terminamos com alguns comentários:
• Se não conseguir reiniciar uma sessão de depuração, comece por apagar todos os pontos de parada definidos (Run → Remove all Breakpoints).
• O Eclipse utiliza o comando symbol-file para carregar os símbolos de depuração, em vez do comando file do GDB. Como resultado, o executável não é carregado pelo GDB e um subsequente comando load vai falhar. Assim, no caso de pretender fazer depuração a partir da RAM, deve adicionar explicitamente o comando file à lista de comandos a executar no inicialização (ou carregar manualmente o programa no console do GDB). Neste caso, lembre-se de indicar o caminho completo, utilizando barras duplas, isto é, ‘\\’ em vez de cada ‘\’, tal como indicado na Figura 10.