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:

http://maurinsoft.com.br/index.php/2021/06/15/servidor-de-fala/

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:

http://maurinsoft.com.br/index.php/2021/02/08/comandos-do-gdb/
Comandos do GDB

A seguir mostrarei como utilizar o debug de forma prática.

Segunda parte do tutorial

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:

  1. Servidor de debug ou máquina debugada
  2. 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:

Debug remoto