desenvolvendo em ambientes unix

49

Upload: alexandre-mulatinho

Post on 25-Jul-2015

923 views

Category:

Technology


3 download

TRANSCRIPT

http://

alex.m

ulatinho.net

Conceitos básicos para desenvolvimento de sistemas

em ambiente Linux

Alexandre MulatinhoE-mail: [email protected]

Mulatinho's Webloghttp://alex.mulatinho.netTwitter: @alexmulatinho

11 de junho de 2014

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Antes de mais nada...

A quem se

destina estes

slides?

Iniciantes no mundo Unix/Linux.

Pro�ssionais em busca de maisconhecimento em desenvolvimentoutilizando ferramentas livres.Quem quer aprender o básico sobre:

a linguagem C,

desenvolvimento,

controle de versões e

debug em sistemas Unix.

Entusiastas do uso de software livre!

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Conceitos Básicos

O que é um programa?Uma série de instruções utilizando uma linguagem de

programação dentro de uma máquina capaz de interpretá-las e

processá-las com um objetivo especí�co.

Como ele é feito?No �nal um programa é constituído de "0"s e "1"s e só é

entendido pelo computador, seria inviável desenvolvermos algo

assim e por isso foram de�nidas palavras por programadores

que contendo uma lógica adequada constroem um programa

de computador.

Quais ferramentas utilizo para desenvolvê-lo?Basicamente você precisa de três coisas: um editor para

construir o seu código, um compilador que transformará o seu

código em um objeto entendido pela arquitetura do seu

computador e um linker que irá unir todos os objetos em um

único binário entendido pelo seu sistema operacional.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Conceitos Básicos

Então agora que já sabemos o que é um programa de computadordevemos de�nir que tipos de programa existem e para quêpropósito eles foram criados, tendo como base estas a�rmaçõespodemos classi�car os programas em dois tipos:

Software de sistema: são programas de computadores críticose que trabalham entre a camada de hardware e software, elessão utilizados pelo usuário constantemente, embora usuáriosleigos não tenham ciência disso pois é necessário que ossoftwares de aplicativo façam a ponte entre eles.

Exemplos: Firmwares, RTOS, drivers de dispositivos.

Software aplicativo: esses são os nossos softwares do dia a dia,que todo o usuário gosta de usar e hoje devido a necessidadede tecnologia nós seres humanos não vivemos sem eles.

Exemplos: VIM, AWK, Firefox, Eclipse, Java, C,

Nesta apresentação iremos focar apenas no segundo tipo.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Conceitos Básicos

Então agora que já sabemos o que é um programa de computadordevemos de�nir que tipos de programa existem e para quêpropósito eles foram criados, tendo como base estas a�rmaçõespodemos classi�car os programas em dois tipos:

Software de sistema: são programas de computadores críticose que trabalham entre a camada de hardware e software, elessão utilizados pelo usuário constantemente, embora usuáriosleigos não tenham ciência disso pois é necessário que ossoftwares de aplicativo façam a ponte entre eles.

Exemplos: Firmwares, RTOS, drivers de dispositivos.

Software aplicativo: esses são os nossos softwares do dia a dia,que todo o usuário gosta de usar e hoje devido a necessidadede tecnologia nós seres humanos não vivemos sem eles.

Exemplos: VIM, AWK, Firefox, Eclipse, Java, C,

Nesta apresentação iremos focar apenas no segundo tipo.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Conceitos Básicos

Então agora que já sabemos o que é um programa de computadordevemos de�nir que tipos de programa existem e para quêpropósito eles foram criados, tendo como base estas a�rmaçõespodemos classi�car os programas em dois tipos:

Software de sistema: são programas de computadores críticose que trabalham entre a camada de hardware e software, elessão utilizados pelo usuário constantemente, embora usuáriosleigos não tenham ciência disso pois é necessário que ossoftwares de aplicativo façam a ponte entre eles.

Exemplos: Firmwares, RTOS, drivers de dispositivos.

Software aplicativo: esses são os nossos softwares do dia a dia,que todo o usuário gosta de usar e hoje devido a necessidadede tecnologia nós seres humanos não vivemos sem eles.

Exemplos: VIM, AWK, Firefox, Eclipse, Java, C,

Nesta apresentação iremos focar apenas no segundo tipo.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Ferramentas importantes

Para que você seja e�ciente desenvolvendo uma aplicação vocêdeve obter algumas ferramentas que serão úteis durante todo oprocesso, algumas delas vamos discutir mais a frente, outras não,eis aqui algumas delas:

Editor de texto Aqui vale a pena perder algumas horas escolhendoum editor que mais se adeque ao seu estilo, hoje emdia com a febre dos IDEs é difícil encontrar quemconsiga programar sem um deles, aqui particularmenteeu utilizo o VIM e algumas vezes o Geany.

Compilador Para que seu código depois de editado se transformeem um binário e você possa executá-lo é críticoescolher o compilador adequado, infelizmente muitasvezes aqui você não terá opção, principalmente seestiver trabalhando com sistemas embarcados.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Ferramentas importantes

Controle de versão Muitas vezes iniciantes de programação ou atéprogramadores experientes ignoram o fato de quedevem ter controle sobre suas versões dedesenvolvimento, quando percebem que isto é muitoimportante já estão com o projeto todo bagunçado eé muito pior corrigir depois.

Diagnóstico Muito úteis para analisar os binários como osdebuggers, aqui também se encaixariam ferramentasde trace como o strace, ltrace.

Auxiliares Ferramentas de auxílio como o autotools que gerampara você scripts de con�guração, compilação, etc.são cruciais para fazer você não perder tempo comrotinas mecânicas.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Ferramentas importantes

Editores de textoVIM, LaTeX, Eclipse, Geany, Emacs, MS Visual C++, etc.

CompiladoresGCC, Visual C++, TinyC, LLVM-Clang, etc.

Controles de VersãoGit, Subversion, Mercurial, CVS, etc.

DiagnósticoGDB, binutils, strace, ltrace, etc.

AuxiliaresAutoconf, Automake, Scripts Shell ou Batch, QMake, etc.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Um pouco de história

Talvez seja difícil de imaginar para alguns mas até 1970, exceto emalguns programas especí�cos escritos nas linguagens "modernas"daepóca BASIC, COBOL, BCPL, etc., todos os outros eram escritosem Assembly, mais ou menos assim:

linux x86 assembly

1 movl %eax, -44(%rbp)2 movl $0, %edx3 movl $1, %esi4 movl $2, %edi5 call socket6 movl %eax, -4(%rbp)7 cmpl $-1, -4(%rbp)8 jne .L29 movl $1, %eax

10 jmp .L8

z80 assembly

1 org 1000h ;Origin at 1000h2 memcpy public3 loop ld a,b ;Test BC,4 or c ;If BC = 0,5 retz ; Return6 ld a,(de) ;Load A from (DE)7 ld (hl),a ;Store A into (HL)8 inc de ;Increment DE9 inc hl ;Increment HL

10 dec bc ;Decrement BC11 jp loop ;Repeat the loop12 end

Na epóca em que desenvolver era função de programadores deverdade que tinham que lêr os manuais de arquitetura doprocessador, gerenciar a memória de seus programas, etc. Hoje arealidade é bem diferente, utilizamos bibliotecas e funçõesdesenvolvidas por terceiros e as adequamos aos nossos programas.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Um pouco de históriaE onde está o C nisso!?

Criado por Dennis Ritchie eKen Thompson no períododos anos de 1969 até 1972.

Estruturada, imperativa,procedural e padronizadapela ISO.

Utilizada em baixo nível ealto nível.

A maioria dos sistemas operacionais modernos são escritos em C,por ser capaz de realizar abstrações, mexer com bits e bytes econtrolar de forma e�ciente a memória. C é simplesmente alinguagem que criou o Unix, o Linux, o C++ e vários outrosprogramas utilizados até hoje.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CTipos de dados

A linguagem de programação C, diferente das linguagens modernas,possui apenas 32 (trinta e duas) palavras reservadas por padrão.São elas:

auto break case char const continuedefault do double else enum extern�oat for goto if int long

register return short signed sizeof staticstruct switch typedef union unsigned voidvolatile while

Destas palavras cinco delas são tipos de dados:

char int �oat void double

Para cada tipo de dado também existem modi�cadores como:

. signed unsigned long short .volatile extern register auto const static

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CEstrutura básica e declarações de variáveis

Um programa em C comum contém a seguinte estrutura

1 Comando do pré processador.2 Tipos de dados de�nidos globalmente.3 Protótipos de funções.4 Funções e variáveis locais das funções.

De�nição de variáveis em C e seus tamanhos reais em bytes

Declarações simples

int i; int j = 10;int x = j * 5;char c = 'j';char ola[5] = { 'h', 'e', 'l', 'l', 'o' };float pi = 3.14;char nums[2][2] = { { 0, 0 }, {0, 0} };

Tamanho de tipos de dados

sizeof(void): 1 byte // tipo de dadosizeof(char): 1 byte // tipo de dado

sizeof(short): 2 bytes // modificadorsizeof(int): 4 bytes // tipo de dado

sizeof(float): 4 bytes // tipo de dadosizeof(double): 8 bytes // tipo de dado

sizeof(long): 8 bytes // modificador

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CFluxos de controle em C

Fluxos de controle são comandos que desviam o programadependendo de alguma condição ou iteração, em C existem cincopalavras chaves para executar desvios e iterações no seu programa,são elas:

O comando 'while'e o 'do-while'

while (!(ret = comidaPronta(forno)))

{

make_the_rango();

ingredientes++;

}

do {

ret = check_the_books();

if (ret)

study++;

} while (!study);

O comando 'for', o 'break' e 'continue'

for (i=0; i<10; i++) {

if (i == 8)

break;

esle if (i % 2)

continue;

fprintf(stdout, "Hi!\n");

}

break, para a execução do loop.

continue, vai para próxima iteração.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CIf-then-else e o operador '?'

As formas mais simples de criar condições em C são através dofamoso if-then-else e do operador '?', vamos aos exemplos.

If-then-else e o operador '?'if (loop < 10)

do_math_things();

else if (!strncmp(string, "recv from:", 10)) {

add_mail_from(string);

from++;

}

else

return -1;

ab = (a>b) ? a : b;

Não há muito o que dizer aqui em relação ao if-then-else, ooperador '?' realiza um teste na expressão à esquerda e se acondição for falsa retorna o primeiro valor depois do operador ou severdadeira, o segundo valor após os ':' (dois pontos).

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CO comando switch

O switch é chamado de 'if elegante', ele não é tão poderoso poistrata apenas expressões simples e geralmente apenas variáveis, émuito utilizado para selecionar opções em loops de menu.

Switchswitch (var) {

case 2:

total += var;

break;

case 27:

total *= 25;

default:

total++;

}

O case sempre deve ser um número ou um hash, lembrando que emC um número também pode ser uma letra como em 'A', 'B' ou 'C'.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao C

FunçõesProtótipo éescrito deforma resumidano início dosfontes.

O retorno dafunção podeser void (nada)ou um tipo dedado.

EstruturasDeclaração de Struct

struct Carro {float velocidade, litros;char marca[TAM_MARCA];char modelo[TAM_STRING];

};

struct Carro *fiat;

Usando novos tipos de dados

typedef struct {int tipo;int idade_maxima;char nome[32];

} Animal;

Animal *cachorro;

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Uma rápida introdução ao CPonteiros e alocação dinâmica de memória

Um dos maiores problemas para programadoresiniciantes em C é a questão dos ponteiros, paraajudar a entender podemos fazer algumasa�rmações:

A memória alocada é segmentada de forma linear.

Em C quando usamos o operador &var estamosdizendo 'o endereço da memória do ponteiro var', equando usamos o operador *var estamos dizendo 'ovalor contido no ponteiro var'.

Alocação Dinâmica de Memória

char *ptr = malloc(100);int *nptr = malloc(sizeof(int) * 50);nptr = realloc(&nptr, (sizeof(int) * 75));

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Desenvolvendo programas

Vamos fazer o clássico "Hello World"para começar, elesimplesmente imprime o texto na saída do monitor, podemos vêr aestrutura básica de um programa em C e como o compilamos.

1 #include <stdio.h>2

3 int main(void)4 {5 fprintf(stdout, "Ola meu jovem!\n");6 return 0;7 }

Duas coisas a comentar aqui:

A palavra #include é utilizada para incluir bibliotecas.

Palavras em C terminam suas declarações com um ';' (ponto evirgula) exceto alguns �uxos de controles como: if, while, else.

Compilando e rodando o programa$ gcc -o prog1 prog1.c$ ./prog1Ola meu jovem!

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Desenvolvendo programas

Dessa vez vamos complicar um pouquinho mais, o objetivo doprograma é encontrar entre dois números qual é o maior, para issoseparamos o programa em três arquivos distintos:

func01.c

#include "headers.h"

int main(void){

int i = 2, j = 0;

for (; j < loop; j++)func02(i, j);

return 0;}

Como compilar

$ gcc -o func01.o -c func01.c$ gcc -o func02.o -c func02.c$ gcc -o func func01.o func02.o

headers.h

#include <stdio.h>

#define loop 5#define myfunc_max(a, b) a > b ? a : b;

func02.c

#include "headers.h"

void func02(int i, int j){

int res = myfunc_max(i, j);fprintf(stdout,

"in(%d,%d) maximo: %d\n",i, j, res);

}

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Desenvolvendo programasUm simples Make�le para projetos pequenos

Para automatizar nosso processo de compilação em projetospequenos nós criamos um arquivo chamado Make�le. Abaixopodemos ver um exemplo com quatro fontes distintos e três alvosdiferentes para o comando 'make'

Make�leall: tracker

tracker: ptracker_main.cgcc -W -g -ggdb -o ptracker_utils.o -c ptracker_utils.cgcc -W -g -ggdb -o ptracker_mem.o -c ptracker_mem.cgcc -W -g -ggdb -o ptracker_main.o -c ptracker_main.cgcc -W -g -ggdb -o ptracker ptracker_main.o ptracker_utils.o ptracker_mem.o

test: ptracker_funcs.cgcc -W -g -ggdb -o ptracker_funcs ptracker_funcs.c

clean:rm -f *.o *~ ptracker ptracker_funcs

O que este alvo faz?

$ make clean

O que este alvo faz?

$ make test

O que este alvo faz?

$ make

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Desenvolvendo programasBibliotecas comuns

Tabela de bibliotecas C ANSI C99

assert.h detecção de erros lógicos dentro dos programaserrno.h códigos de erro de funções de outras bibliotecaslimits.h constantes númericas padrões no ANSI Clocale.h internacionalização de textos e caracteresmath.h funções matemáticas úteis em Csignal.h sinalização de eventos e sinaisstdio.h biblioteca de entrada e saída de dados padrão

string.h manipulação de stringsstdlib.h alocação de memória, números randomicos, etc.

Compilando código com biblitoecas alternativas

Utilizando POSIX Threads

$ gcc -o prog prog.c -lpthread

Utilizando GTK no grá�co

$ gcc -o gtktest gtktest.c `pkg-con�g �c�ags �libsgtk+-2.0`

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando controle de versões

Hoje em dia desenvolver qualquer coisa com mais de mil linhas decódigo sem um controlador de versões é confusão na certa, aindamais se esse código precisa ser compartilhado e desenvolvido pormais de uma pessoa.

De�nição

Como o próprio nome diz ele serve para guardar informações(autor, o que foi modi�cado, quando foi modi�cado, comentáriosde porque houve a modi�cação) sobre um determinado arquivo ouprojeto em um intervalo de tempo, dando possibilidade aosintegradores de juntar versões diferentes ou voltar a umadeterminada versão gerada em uma linha de tempo.

Imagine um projeto do tamanho do Linux com mais de 5 milhõesde linhas sem um controlador de versão para mandar pra dentro oque a galera adiciona ao código!?!?

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando controle de versões

Principais características encontradas nos controladores de versão

Desenvolvimento descentralizado.

Marcações de momentos importantes.

Controle de histórico dos arquivos do projeto.

Linhas de desenvolvimento paralelas(estável, instável) oubranches para adição de novas funcionalidades.

Otimização de espaço, velocidade de transações, locksexclusivos.

Infelizmente não poderemos vêr todas as vantagens aqui, o assuntosobre controle de versões é bastante amplo e deve �car para umaapresentação especí�ca. Mas vamos a algumas dicas....

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando controle de versões

Imagine o grá�co ao ladocomo a linha dedesenvolvimento de software.

Note a linha do tempo decima para baixo.

Os itens de cor:

Azul Representam as releases,as tags/versões o�ciaisdo produto.

Amarelo Desenvolvimento bruto,onde são adicionadositens ao projeto.

Rosa Novas rami�cações,onde são desenvolvidositens antes de entrar nasversões dedesenvolvimento e ourelease de versões.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando controle de versõesGIT, criado por Linus Torvalds.

Abaixo podemos ver uma lista de exemplos de comando do GIT eseus signi�cados, acredite depois de um ou dois dias mexendo issose torna fácil e muito útil no seu dia a dia.

Cria um repositório GIT

$ cd projetos/super-secreto && git init

Clona um repositório remoto para a máquina local

$ git clone https://github.com/mulatinho/sfm.git

Veri�ca as mudanças feitas no diretório local

$ git status

Pega as atualizações do repositório original

$ git pull

Mostra as diferenças feitas no arquivo "libsmb.c"

$ git di� libsmb.c

Faz commit do arquivo "libsmb.c"

$ git commit -m '2 novas funcoes' libsmb.c

Envia suas modi�cações ao repositório remoto

$ git push origin master

Lista branchs criadas

$ git branch

Cria branch "cpp-list"

$ git branch cpp-list

Lista todas as tags do repositório

$ git tag -l

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotools

Lembra como compilar um programa? Como gerar um Make�le!?Agora imagine se você tivesse que compilar mais de trinta arquivosum a um e depois fazer o link dos objetos na mão, centenas devezes, quantas vezes você erraria a ordem de compilação?esqueceria um ou outro fonte/objeto? Para evitar que isso aconteçae que você não precise sempre realizar esse trabalho de maluco, aGNU desenvolveu a ferramenta chamada autotools.

Quem nunca fez!?

$ ./con�gure$ make$ make install

Apesar de eles serem scripts shell que auxiliam o usuário a gerar obinário apartir dos códigos de fonte, eles não são geradosmanualmente pelos programadores do projeto.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotools

Principais módulos da ferramenta autotools

Autoconf Responsável por gerar o arquivo 'con�gure', muitoútil na hora de compilar o projeto pois ele checa setodos os pré-requisitos foram atentidos, caso nãotenham sido ele geralmente retorna ao usuário osoftware, função, etc. que está faltando para compilaro projeto.

Automake Apartir dos arquivos de entrada do 'Makefile.am'

ele gera o famoso 'Make�le' que é responsável porprocessar os comandos do usuário 'make' e 'makeinstall'.

Libtool Geralmente utilizado em conjunto com o autoconf e oautomake, o libtool faz a função de cross compiler,apartir das entradas do './configure' e passandoargumentos como '�arch' é possível especi�car paraque arquitetura será compilado o projeto.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotools

Com apenas a edição de dois arquivos,

'Make�le.am'

'con�gure.ac'

e mais três comandos (listados abaixo) geramos de forma e�cienteno nosso projeto o sistema de builds da GNU, tornando nossa vidamais fácil.

Utilizando o sistema de builds da GNU passo-a-passo% aclocal% autoconf% touch README AUTHORS NEWS ChangeLog% automake -aconfigure.ac: installing `./install-sh'configure.ac: installing `./mkinstalldirs'configure.ac: installing `./missing'Makefile.am: installing `./INSTALL'Makefile.am: installing `./COPYING'Makefile.am: installing `./depcomp'

Então, como gerar os arquivos necessários para o projeto!?

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotoolsO arquivo de entrada 'Make�le.am'

Arquivos do projeto:Make�le.am con�gure.ac func01.c func02.c headers.h

O arquivo 'Make�le.am' é a entrada que contém a especi�cação detodos os seus fontes, bibliotecas de compilação (CFLAGS eLDADD), arquivos de documentação e arquivos comuns do projeto,além de diretórios para build, etc. Vejamos um exemplo bem básicoabaixo de seu conteúdo:

Make�le.am## Makefile.am -- Processamos este arquivo para gerar o Makefile.in## que é lido depois para gerar o 'Makefile' através do autoconfbin_PROGRAMS = funcmaxfuncmax_SOURCES = func01.c func02.c headers.h

## Se eu quisesse adicionar umas flags pro C aqui eu faria:

## Já no caso de bibliotecas eu faria:## funcmax_LIBADD = -lm -lcrypto## funcmax_LDADD = @

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotoolsO arquivo de entrada 'con�gure.ac'

Um típico arquivo 'con�gure.ac' é a entrada para os comandosaclocal e autoconf, ele é de�nido usando a descrição macro m4 enão é tão difícil de entender depois de alguns minutos lendo suadocumentação, vejamos um exemplo:

con�gure.acdnl Isto é um comentário e é útil para documentar suas modificaçõesdnl Checa se o autoconf é pelo o menos da versão 2.58AC_PREREQ(2.58)

dnl Define o nome, versao e e-mail do desenvolvedorAC_INIT([funcmax], [0.1], [[email protected]])

dnl Coloca como requisito que o automake tenha versão 1.8 ou superiorAM_INIT_AUTOMAKE(1.8)

dnl checa se existe um compilador C, linker, lnAC_PROG_CCAC_PROG_LN_SAC_PROG_RANLIB

dnl Gera um arquivo Makefile no finalAC_CONFIG_FILES([Makefile])AC_OUTPUT

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Utilizando o autotoolsGerando o build do projeto

mulatinho@forrest:~/repo/github/docs/c_basics/ex$ aclocalmulatinho@forrest:~/repo/github/docs/c_basics/ex$ autoconfmulatinho@forrest:~/repo/github/docs/c_basics/ex$ touch NEWS README AUTHORS ChangeLogmulatinho@forrest:~/repo/github/docs/c_basics/ex$ automake --add-missingmulatinho@forrest:~/repo/github/docs/c_basics/ex$ ./configurechecking for a BSD-compatible install... /usr/bin/ginstall -cchecking whether build environment is sane... yes........checking dependency style of gcc... gcc3checking whether ln -s works... yeschecking for ranlib... ranlibconfigure: creating ./config.statusconfig.status: creating Makefileconfig.status: executing depfiles commandsmulatinho@forrest:~/repo/github/docs/c_basics/ex$ makegcc -DPACKAGE_NAME=\"funcmax\" -DPACKAGE_TARNAME=\"funcmax\" -DPACKAGE_VERSION=\"0.1\"-DPACKAGE_STRING=\"funcmax\ 0.1\" -DPACKAGE_BUGREPORT=\"[email protected]\"-DPACKAGE_URL=\"\" -DPACKAGE=\"funcmax\" -DVERSION=\"0.1\" -I. -g -O2 -MT func01.o-MD -MP -MF .deps/func01.Tpo -c -o func01.o func01.cmv -f .deps/func01.Tpo .deps/func01.Pogcc -DPACKAGE_NAME=\"funcmax\" -DPACKAGE_TARNAME=\"funcmax\" -DPACKAGE_VERSION=\"0.1\"-DPACKAGE_STRING=\"funcmax\ 0.1\" -DPACKAGE_BUGREPORT=\"[email protected]\"-DPACKAGE_URL=\"\" -DPACKAGE=\"funcmax\" -DVERSION=\"0.1\" -I. -g -O2 -MT func02.o-MD -MP -MF .deps/func02.Tpo -c -o func02.o func02.cmv -f .deps/func02.Tpo .deps/func02.Pogcc -g -O2 -o funcmax func01.o func02.o

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Agenda

Conceitos Básicos

Ferramentas importantes

Um pouco de história

Uma rápida introdução ao C

Desenvolvendo programas

Utilizando controle de versões

Utilizando o autotools

Debugando seu código

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoPor quê debugar??

Debugar é o ato de con�rmar que algo que você pensa que éverdadeiro de fato o é, ou que, provando passo a passo vocêdescubra que algo não é tão verdadeiro quanto você pensava ser.

Um bug nada mais do que uma condição de erro, falha ou algo queé inesperado numa série de rotinas que deveriam seguir uma lógicaconhecida. Debugar então é necessário para con�rmar que seuprograma está seguindo todas as rotinas que você escreveu semcondições desconhecidas a você.

Alguns motivos para debugar:

Identi�car um erro e/ou condição

Acompanhar uma rotina detalhadamente

Determinar loop in�nito, execuções de threads, variáveis, etc.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoUtilizando o GDB

O GDB é o projeto da GNU para debugar aplicativos escritosprincipalmente em C/C++ mas também tem capacidade deinteragir com muitas outras linguagens, nós vamos focar aqui naferramenta de console para que você possa entender processosbásicos na etapa de debug de um programa.

Compilando programa erodando no GDB

$ gcc -g -o program1program1.c$ gdb program1(gdb) run <argv1>...<argvN>

Principais erros

bu�er over�ow

stack over�ow

memory leak

loops, retornos defunção, etc.

gdb1.c example1 #include <stdio.h>2 int main(void) {3 char *things[] =4 { "casa", "carro", "viajar" };5 int i = 0, x = 0, j = 0;6 while (1) {7 if (x == 11) break;8 printf("i=%d, x=%d, j=%d, %s\n",9 i, x, j, things[i]);

10 if (!(i % 3) && i!=0) {11 i = 0; x+=2;12 } else13 i++;14

15 x++;16 j = ((2^4) * i) + x;17 }18 return 0;19 }

gdb2.c example1 #include <stdio.h>2

3 void set_pointer(char *p)4 {5 *p = 10;6 }7

8 int main(void)9 {

10 char *p = NULL;11

12 set_pointer(p);13

14 return 0;15 }

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoUtilizando o GDB, parte 2

comandos descrição

run roda o programa em questão, pode usar argumentos.break / watch seta um breakpoint/watchpoint dentro do código fonte.step / next step, adentra na subrotina dentro da função atual. ja o

next vai para a proxima linha da função atual.continue continua a execução até que o próximo breakpoint seja

encontrado no código.print / display imprime o valor de uma variavel, struct, dado.

info mostra informações de registradores, variáveis locais, etc.

exemplo debugando com gdb, parte 1

$ gdb gdb2(gdb) b 8Breakpoint 1 at 0x400567: file gdb2.c, line 8.(gdb) r.....(gdb) cContinuing.i=2, x=8, j=20, viajar

Breakpoint 1, main () at gdb2.c:88 printf("i=%d, x=%d, j=%d, %s\n",

exemplo debugando com gdb,parte 2

(gdb) display things[i]1: things[i] = 0x400440 <_start> "1\355I\211...(gdb) p i$1 = 3(gdb) ni=3, x=9, j=27, 1ï¾ 1

2Iï¾ 1

2ï¾ 1

2^Hï¾ 1

2..

10 if (!(i % 3) && i!=0) {....(gdb) n15 x++;(gdb) p x$2 = 12

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu código

Para os que não gostam de comandos de console é claro que temossoluções livres e grá�cas!! É o estilo do DDD.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoUtilizando o strace

O 'strace' é utilizado para rastrear com detalhes ou de formaresumida chamadas de sistema executadas dentro de softwares

Chamadas de sistema são requisições de serviços de�nidosdiretamente no kernel com uma função especí�ca.

Sempre que você carrega uma biblioteca, lê ou escreve em umarquivo você está executando uma chamada do sistema.

No linux as chamadas do sistema estão descritas no cabeçalho/usr/include/asm/unistd.h.

Como executar o strace?$ strace -c ps ax% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ----------------61.08 0.001083 1 834 read20.70 0.000367 1 720 6 open11.17 0.000198 0 715 close7.05 0.000125 0 268 10 stat

------ ----------- ----------- --------- --------- ----------------100.00 0.001773 2628 20 total

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoUtilizando o strace, parte 2

Também podemos analisar detalhadamente cada chamada, abaixopodemos ver a simples saída do strace sem muito detalhamentomas que nos ajudam bastante1 $ strace nc localhost 11112 execve("/usr/bin/nc", ["nc", "localhost", "1111"], [/* 51 vars */]) = 03 open("/lib64/libssl.so.10", O_RDONLY|O_CLOEXEC) = 34 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\203\201\246<\0\0\0"..., 832) = 8325 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 36 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)7 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 08 connect(3, {sa_family=AF_INET, sin_port=htons(1111),9 sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)

10 select(4, [3], [3], [3], {10, 0}) = 2 (in [3], out [3], left {9, 999995})11 getsockopt(3, SOL_SOCKET, SO_ERROR, [111], [4]) = 012 write(2, "Ncat: ", 6Ncat: ) = 613 write(2, "Connection refused.\n", 20Connection refused.) = 2014 +++ exited with 1 +++

Alguns itens a observar:Na linha 2 (dois) é mostrado a execução do comando na shell.

Na linha 3 (três) é carregada uma biblioteca SSL.

Na linha 8 (oito) vemos claramente o retorno -1 da execução do programa bemcomo os argumentos passados pela função connect()

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoValgrind para memória

O valgrind analisa erros de softwares diretamente ligados amemória, é muito útil para descobrir memory leaks.

O código ao lado mostra umprograma com dois problemas:um comportamento inde�nido(um dos erros mais difíceis dedetectar sem uma ferramentaadequada em C) e um vazamentode memória devido aoalocamento sem liberação.

O valgrind aponta aquantidade de bytes escritosna memória que contémerros ou vazamento.

gdb4.c example

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4

5 int main(void)6 {7 int i;8 char *ptr = malloc(sizeof(int) * 100);9

10 srand(time(NULL));11 for (i=0; i<110; i++)12 *(ptr + i) = (rand() % 255) + 1;13

14 return 0;15 }

Identi�ca a funçãoresponsável e a linha dentrodo código fonte.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Debugando seu códigoValgrind para memória, parte 2.

1 $ gcc -g -Wall -o gdb4 gdb4.c

2 $ valgrind --leak-check=full ./gdb4

3 ==18493== Memcheck, a memory error detector

4 .....

5 ==18493== HEAP SUMMARY:

6 ==18493== in use at exit: 400 bytes in 1 blocks

7 ==18493== total heap usage: 1 allocs, 0 frees, 400 bytes allocated

8 ==18493==

9 ==18493== 400 bytes in 1 blocks are definitely lost in loss record 1 of 1

10 ==18493== at 0x4C2C5AB: malloc (vg_replace_malloc.c:270)

11 ==18493== by 0x40071A: main (gdb4.c:8)

12 ==18493==

13 ==18493== LEAK SUMMARY:

14 ==18493== definitely lost: 400 bytes in 1 blocks

15 ....

Na linha 9 até a linha 11 vemos claramente que houve um vazamento dememória provocado pela linha 8 do nosso programa gdb4.c

Finalmente o resumo �nal con�rma o vazamento de memória e informa quantosbytes foram perdidos.

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix

http://

alex.m

ulatinho.net

Isso é tudo pessoal!

Dúvidas e Sugestões?

Alexandre MulatinhoTwitter: @alexmulatinhoE-mail: [email protected]: http://alex.mulatinho.net

Alexandre Mulatinho E-mail: [email protected] Introdução ao desenvolvimento em ambientes Unix