Criando aplicação debugavel no linux
Objetivo
Neste tutorial, apresentaremos o básico necessário para permitir a criação de uma aplicação, inclusive debugar quando necessário.
Gerando o binário
Neste tópico criarei um binário, que é um executável.
Para este exemplo, usarei o projeto do git:
https://github.com/MarceloMaurin/srvFalar
O projeto é um servidor de sintetização de voz, um maior detalhamento sobre este projeto pode ser visto no artigo abaixo:
Makefile
O Makefile é o construtor da aplicação. Com ele podemos gerar o binário, bem como realizar atividades de instalação e preparação, previas para sua construção.
Outra atividade de responsabilidade do Makefile, é a geração de versão de debug.
Abaixo o exemplo do Makefile do nosso projeto.
#HEADERS = program.h headers.h
MYESPEAK=-lespeak
default: all
all: clean compile install
compile:
gcc fala.c $(MYESPEAK) -Wall -o SRVFalar
install:
cp SRVFalar /usr/local/bin/
debug:
gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar
clean:
rm -f /usr/local/bin/SRVFalar
rm -f ./SRVFalar
Nele exemplo podemos ver que existem 5 alvos de compilação:
- all
- compile
- install
- debug
- clean
O alvo all, é o padrão, e quando não indicado um alvo de compilação no make, usa-se este por padrão.
make
make sem alvo, subentende-se o all
Podemos também usar o alvo debug, que é destinado a gerar os binários de debug.
make debug
gerando binario de debug
O compilador GCC, possui como parametro de debug o -g, que deve ser usado quando se deseja debugar uma aplicação.
gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar
A seguir, estarei apresentando um vídeo sintetizando cada passo descrito acima.
Debugar é
Debugar é entender o que esta acontecendo internamente em um projeto, analisando cada passo de um programa.
Analisando não só suas entradas e saídas, mas tambem os passos e atividades relacionados a sua execução.
Usando o DEBUG
Para utilizar o debug, usamos o comando:
gdb <progrma> [fonte]
sintaxe do gdb
No nosso caso podemos chamar o debug, através do exemplo abaixo:
gdb SRVFalar
Os comandos do debug podem ser vistos, através de outro artigo que montei:
A seguir mostrarei como utilizar o debug de forma prática.
Emulando passagem de argumentos
Quando houver necessidade de emular a execução do binário com passagem de argumentos, siga os seguinte passos:
Entre no gdb
gdb [aplicação]
Execute o comando set, passando os argumentos, conforme figura abaixo:
set args [arg1] [arg2] … [arg3]
Por fim inicie a aplicação com o debug.
r
Debug remoto
O Debug remoto, é necessário quando temos uma maquina e o nosso ambiente de desenvolvimento esta em outra.
Desta forma, é possível identificar problemas de hardware ou software na maquina alvo, sem de fato estar alocado nela.
O Debug remoto é divido em 2 parter:
- Servidor de debug ou máquina debugada
- Ambiente de desenvolvimento
Maquina debugada
Nesta máquina é necessário instalar o servidor de debug. Pois iremos nos conectar nela.
Para funcionar, a maquina precisa ter uma porta TCP liberada para a maquina de desenvolvimento.
O programa que será necessário é o gdbserver, que pode ser baixado no ubuntu pelo comando:
apt install gdbserver
Depois das pré-condições liberadas para seu desenvolvimento, precisamos rodar o gdbserver, através da sintaxe:
gdbserver [aplicacao] [host]:[port] <&>
A aplicação é o binário que deseja ser debugado, como no gdb, precisa ser criado com a opção -g
O host é a o ip que será ouvido, podendo ser localhost
Port , é a porta tcp que será criada, para receber os comandos.
Segue o exemplo abaixo:

Ambiente de desenvolvimento
Agora iremos debugar no ambiente de desenvolvimento, que possui os fontes.
Para isso usaremos o nosso velho gdb.
gdb
target remote localhost:23456
Passando em seguida o target remote [host]:[porta], ligamos o server ao cliente, e conseguimos o debug remoto.
Conforme figura abaixo:
