Compilando o gdb e o gdbserver para depuração cruzada
- por Sergio Prado
Não são raras as situações onde precisamos depurar remotamente alguma aplicação rodando em um dispositivo com Linux embarcado. E o processo de depuração remoto envolve a presença de um servidor GDB no target e um cliente GDB no host.
A comunicação entre o gdb (client) e o gdbserver pode ser feita pela porta serial ou por uma conexão de rede, e existe um protocolo bem definido entre eles.
O único problema é que, conforme o GDB evolui, seu protocolo também é alterado, o que costuma causar incompatibilidade de versões (determinada versão do cliente pode não ser compatível com uma versão diferente de servidor). Eu particularmente já passei diversas vezes por esta situação, onde alguns comandos enviados por determinada versão do cliente não eram reconhecidos por uma versão diferente do servidor.
Para resolver este problema, a melhor forma é utilizar a mesma versão de cliente e servidor GDB. Para isso, você pode compilar sua própria versão do GDB. E o processo é bem simples.
Primeiro baixe a última versão do código-fonte do GDB (versão 7.10 no nomento em que escrevo este artigo).
$ wget ftp://sourceware.org/pub/gdb/releases/gdb-7.10.tar.xz $ tar xfv gdb-7.10.tar.xz $ cd gdb-7.10/ |
Vamos começar compilando o cliente GDB.
Ao executar o script de configure, precisamos utilizar o parâmetro –target para definir a arquitetura da plataforma-alvo (ARM no meu caso) e o parâmetro –program-prefix para alterar o prefixo do nome do programa (no meu caso irei gerar um binário com o nome arm-linux-gnueabi-gdb):
$ ./configure --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- $ make -j4 $ sudo make install |
Pronto! Agora você tem a versão mais nova do gdb instalado na sua máquina de desenvolvimento e preparado para depurar aplicações em targets de arquitetura ARM:
$ arm-linux-gnueabi-gdb --version GNU gdb (GDB) 7.10 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". |
Agora falta compilar o gdbserver.
Como o gdbserver será compilado para a plataforma-alvo, é necessário um toolchain de compilação cruzada. E como a minha plataforma-alvo é ARM, vou utilizar o toolchain da Linaro que já vem empacotado no Ubuntu, e que pode ser instalado conforme abaixo:
$ sudo apt-get install gcc-arm-linux-gnueabi |
Você pode verificar se o toolchain foi instalado corretamente com o comando abaixo:
$ arm-linux-gnueabi-gcc --version arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.7.3-12ubuntu1) 4.7.3 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
Agora é só compilar o gdbserver. Perceba nos comandos abaixo que iremos gerar uma versão estática do gdbserver. Isso é importante para que o binário gerado possa ser executado no target sem nenhuma dependência de biblioteca.
$ cd gdb/gdbserver/ $ export LDFLAGS="-static" $ ./configure --host=arm-linux-gnueabi $ make -j4 |
No final, você terá uma versão do gdbserver compilada e linkada estaticamente para ARM.
$ file gdbserver gdbserver: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=357aec9e65270acf63ebd84c8f27af14c195eb5e, not stripped |
Agora é so copiar o binário do gdbserver para o target e se divertir. :)
Happy debugging!
Sergio Prado