sexta-feira, 1 de agosto de 2008

Netbeans 6.1 com C/C++ : A diferença entre o modo Release e o modo Debug

.
Você pode compilar seu projeto no NetBeans de duas formas diferentes: modo Debug e modo Release. A diferença entre eles é que no modo Debug seu projeto é compilado de uma forma que disponibiliza informações extras para permitir uma melhor avaliação do seu funcionamento e principalmente a caça de bugs (definição de pontos de parada na execução, verificação "on the fly" dos valores das variáveis, etc).

Vamos verificar na prática. Crie um novo projeto:

file | new project

categories: c/c++
projects: c/c++ application
[next]



project name: teste
[finish]



O NetBeans cria, por default, um diretório com o nome do seu projeto debaixo do diretório NetBeansProjects. Utilize seu navegador de arquivos e confira que dentro deste diretório "teste" só tem um único subdiretório, denominado "nbproject".

Vamos adicionar um arquivo com código-fonte em C:

file | new file

categories: c files
file types: main C file
[next]



Na próxima tela, apenas [finish]


Digite o seguinte programa:

#include stdio.h
#include stdlib.h
[nota: alguém sabe pq o blogger não deixa usar maior e menor??]

int main(int argc, char** argv)
{
int A, B, C;

A = 1;
B = 2;
C = 3;

printf(" %d - %d - %d ", A, B, C);

return (EXIT_SUCCESS);
}


A definição da forma de compilação é feita através do menu "build" :

build | set main project configuration | Debug ou Release


Escolha "release", e depois compile o projeto:

build | build main project

Utilize novamente o gerenciador de arquivos e olhe o interior do diretório "teste". Surgiram dois novos subdiretórios: "build" e "dist". No interior deste último, foi criado o diretório "release", contendo mais um subdiretório (gnu-linux-x86) e dentro dele o arquivo executável gerado por nossa compilação. O nome "release" não apareceu a toa, indica que compilamos nosso projeto no modo "release". Para finalizar esta etapa, anote o tamanho do arquivo executável que foi gerado (no meu caso, 6.3 KB).

Volte ao NetBeans, e escolha o modo de compilação "debug":

build | set main project configuration | Debug

E novamente compile o projeto:

build | build main project

Vamos olhar novamente o interior do diretório "dist". Foi criado agora o diretório "Debug", contendo o executável gerado pela compilação no modo "Debug" (novamente dentro de gnu-linux-x86). Vejamos o tamanho do arquivo executável: 7.3 KB.

Porque maior? Por que, como falei no início, no modo debug o executável é gerado com recursos extras que permitirão executar atividades de debug, tais como definição de pontos de parada, verificação do conteúdo das variáveis ENQUANTO O PROGRAMA ESTIVER RODANDO, etc.

Vamos ver isso funcionando ao vivo e a cores: Vamos definir um ponto de parada. Isso é feito clicando no número da linha onde se deseja que a execução pare. Vamos clicar na linha 8, onde atribuímos o valor 1 à variável A. Vai aparecer uma caixinha vermelha onde antes era o número da linha, e toda a linha ficará destacada em vermelho. Isso indica que a execução vai parar ANTES da execução desta linha.


Para executar o programa utilizando as informações extras de debug, utilize:

run | debug main project

A execução vai iniciar... e nada vai aparecer no terminal, porque o programa parou na linha que indicamos. Volte para a janela principal do NetBeans, e note o indicador estilo "supermáquina" ou "visor cylon" (depende da sua idade...) no canto inferior direito da janela. Isto indica que o programa está em execução, apenas está parado temporariamente. No código fonte, a linha onde o programa está parado fica verde.

Ainda olhando para o canto inferior direito da janela, note uma caixa com as variáveis A, B, C e seus valores, que devem ser os mais loucos possíveis. Isso acontece porque paramos o programa em um momento em que as variáveis foram criadas, mas nenhum valor foi (ainda) atribuído a elas, ou seja, elas estão com os valores aleatórios que toda variável em C recebe assim que é criada (na verdade, a variável não "recebe" nada; ela é associada a uma posição de memória que está com um valor qualquer, ou aleatório gerado quando o computador foi ligado, ou deixado por algum programa anterior).



Um dos recursos disponíveis para nós é a execução passo-a-passo do programa. Podemos mandar o NetBeans executar a próxima linha, e verificar as mudanças nos valores das variáveis (e desta forma, avaliar se o programa está fazendo as coisas corretamente!). Para isso, clique no botão com uma caixa azul e uma seta amarela apontando para baixo (o tooltip indica "step into"), ou vá no menu run | step into, ou simplesmente tecle F7.


A linha verde avançou para a próxima linha, isto é, ele executou o "A = 1". Isto também pode ser notado pela alteração do valor da variável A no box de variáveis.

Pode-se prosseguir assim passo a passo, ou pode-se mandar continuar a execução normalmente (teclando F5, clicando no botão com a seta "play" verde, ou menu run | continue). Note que podemos definir vários pontos de parada no programa.

Mais um teste para finalizar: mude o modo de compilação para "release":

build | set main project configurarion | release

Não precisamos recompilar, pois não mudamos o programa desde que geramos a versão release no início deste post. Vamos então tentar rodar esta versão release no modo debug:

run | debug main project

Necas! Ele ignorou nosso ponto de parada, pois o executável do tipo Release não está preparado para realizar debug.

Um último comentário, a janela de variáveis é bem interessante, pois mostra o conteúdo de membros de estruturas, valores de ponteiros, até mesmo valores de áreas alocadas dinamicamente (simulando um vetor a partir do ponteiro com o endereço inicial). Enfim, um recurso bem interessante pra quem não aguenta mais ficar colocando 'printf' no meio do programa.... (e geralmente esquecendo de tirar alguns deles no final!!)

Abraços a todas e a todos!
Carlão

2 comentários:

Diones disse...

Eu sei que isso não é coisa que se pergunte, a final, IDE é que nem cú, cada um com o seu, mas...
Tem certeza que NetBeans é a melhor opção, quer dizer, todas as vezes que usei o NetBeans para programar qualquer coisa tive ráiva, cansaço e medo. Ela não parece ter sido escrita por pessoas de bem, tudo é muito mal feito, não dá pra fazer nada em paralelo, até os updates rodam na thread principal. Tem eclipse, emacs, aquela coisa do KDE, e anjuta. Você tem certeza que não quer mudar antes que o NetBeans roube a sua alma?

Carlos José disse...

Oi Diones!
Fiz um teste com o NetBeans há muito tempo atrás (não me lembro quanto tempo), e não gostei nada, joguei fora.
Depois disso fiz 2 testes com o Eclipse (entenda "teste" como baixar, instalar, fuçar um pouco...) e também não gostei. Não tenho nenhum "argumento técnico"... apenas não gostei, e pronto!
Experimentei um pouco o Anjuta, ficou naquele meio termo, mas não me deu aquela vontade de "investir", usar, aprender...
Este ano, fui no FISL e na véspera participei de um evento da SUN. Neste evento falou-se do NetBeans, que estava renovado, etc, etc.... uma frase me pegou: "mesmo que você tenha usado ele no passado, dê uma olhada novamente, está muito melhor!" Fiz isso, e realmente o bichinho me conquistou!
Talvez você precise dar mais uma olhada também. Por exemplo, a questão dos upgrades, é feita em background, não me atrapalha em nada...
Enfim, penso que a sua primeira frase resume bem a coisa: IDE, cada um tem a sua... não sei se o NetBeans é "A melhor opção", mas certamente é a minha opção, ou seja, ele "já roubou" minha alma... RISOS!
Grande abraço!
Carlão