sexta-feira, julho 08, 2011

Depuração em C++

Resumo. O presente artigo tem como finalidade explicar os fundamentos de Depuração em Programas C++, utilizando a ferramenta BloodShed Dev-C++, bem como histórico, conceitos e técnicas de depuração.

1. Histórico

            Não há evidências sobre a origem do termo "bug". Diz-se que foi criado por Thomas Edison, quando um inseto causou problemas de leitura em seu fonógrafo, em 1878.
            Grace Hopper, desenvolvedora da Marinha americana, publicou em 1945 a causa do mau funcionamento no Mark II: um inseto preso nos contatos de um Relê.
            O termo "debug" foi usado pela primeira vez em 1976, com a publicação do livro de Glenford J Myers ( Software Reliability: Principles and Practices) .

2. Conceito

            Depuração ou "debug" é o processo de encontrar "bugs" ou problemas, em  softwares ou  mesmo em hardwares.

2.1. There's a bug in the system!¹

            Na Engenharia, "bug" é um jargão para descrever defeitos inexplicáveis.
            Na Computação, "bug" é um erro no funcionamento comum de um software, também chamado de falha na lógica programacional de um programa de computador, que pode causar falhas no objetivo de uma ação na utilização de um programa de computador.
            Bugs podem causar falhas de segurança, principalmente em programas que tem alguma forma de conexão a Internet, como é o caso de navegadores (browsers) e clientes de e-mail, pois crackers podem se aproveitar dessas brechas  para terem acesso a informações e arquivos contidos no computador infectado. São comuns bugs em programas em desenvolvimento, mas, quando descobertos, estes  são consertados por seu programador ou equipe de desenvolvimento.

2.2. "Debugar", "Animar", "Depurar"

            Um depurador, ou "debugger", é um software utilizado para testar programas e fazer sua  depuração,  ou seja, eliminar seus problemas ou bugs.
            Há ferramentas específicas para depuração de programas, as mais conhecidas são encontradas em ferramentas RAD (Rapid Application Development ):
            * Anime (Cobol);
            * O depurador de XSLT e XQuery no editor Oxygen XML;
            * CA/EZTEST (Cics Interactive test/debug);
            * CodeView;
            * DBG - depurador e perfilador para PHP;
            * DBX;
            * DDD, Data Display Debugger, ou depurador por apresentação de dados;
            * Eclipse;
            * GNU Debugger (GDB);
            * Valgrind;
            * Delphi.

3.Como Depurar um Programa em  Dev-C++?

3.1. Terminologias e Definições

            Alguns conceitos básicos são necessários para o entendimento do processo de depuração de um programa. Essas terminologias podem ser atribuidas a maioria dos programas de depuração.
            Observação: As teclas de atalhos citadas são referentes ao depurador da ferramenta BloodShed Dev-C++.

3.1.1. Breakpoint (Ctrl + F5)

            Um breakpoint é um ponto de interrupção na execução do programa para que possa  ser executado passo-a-passo  o processo de depuração.

3.1.2. Debug (F8)

            É o processo de depuração propriamente dito. Uma vez estabelecido um ponto de interrupção (breakpoint), é possível visualizar o comportamento do código durante a execução do programa.

3.1.3. Step (next/into) (F7 / Shift + F7)

            Como o próprio nome sugere, verifica passo-a-passo o processo de depuração. É a "caminhada" sobre o código do programa.
            Há duas formas de "caminhar" sobre o código:
            - Next Step: Executa linha por linha, indiferente de haver saltos para outras funções. Quando há esses saltos, ele executa de forma direta, sem entrar na função requisitada naquele momento.
            - Step Into: Assim como o Next Step, executa passo-a-passo o processo de depuração, porém, quando encontra uma função, ele interrompe a linha do programa, saltando para o função chamada naquele momento.

3.1.4. Watch (add/remove) (F4)

            Esse processo é fundamental durante a depuração. É com ele que determinamos quais valores estão sendo atribuidos as variáveis naquele instante da depuração.
            Pode-se adicionar ou remover um watch, conforme a necessidade do programador.

3.1.5. Run to Cursor (Shift + F4)

            É um atalho do processo breakpoint/debug. Não há necessidade marcar um ponto de interrupção para executar o debug. Basta posicionar o cursor sobre qualquer linha do código do programa-fonte para que o depurador execute e interrompa automaticamente na linha em que o cursor está posicionado.

3.1.6. Stop Execution (Ctrl + Alt + F2)

            É o processo de término de uma depuração.

3.1.7. Backtrace

            Quando estamos depurando um programa, em alguns casos  necessitamos visualizar "por baixo", quais funções estão vinculadas a linha do código que estamos depurando. O Backtrace mostra exatamente quais as funções estão sendo executadas naquele momento.

3.1.8. Output

            Exibe uma grade com as saídas do debug. É uma espécie de log do depurador.

3.2. Configurações Necessárias para Depuração

            1) Utilizar um Projeto ( File /New (ou Open)/Project );
            2) Alterar as Opções do Projeto => Project / Project Options / Compiler:
            - Linker: habilitar a opção "Generate debugging information";
            - Optimization:  Certificar que  todas  as  opções  estejam desativadas.

3.3. Técnicas de Depuração

            1) Marcar breakpoints (Ctrl + F5);
            2) Executar o debug (F8 ou Shift + F4);
            3) Utilizar o modo passo-a-passo (F7) ou (Shift + F7);
            4) Adicionar um watch;
            5) Verificar o resultado;
            6) Continuar ou finalizar a execução. (Ctrl + F7) ou (Ctrl + Alt + F2).

4. Conclusão

            A depuração é o meio mais eficiente de detectar erros em programas que, dificilmente, são encontrados em tempo de desenvolvimento. Erros lógicos ou situações imprevistas em um sistema podem ser rapidamente identificados a partir do momento que é depurado o código "problemático".

5. Referências

            http://pt.wikipedia.org/wiki/Bug
            Help on Dev-C++ (Ajuda do BloodShed Dev-C++)
          Extraído do Filme MiB II (Men in Black II), quando a personagem avisa os usuários do metrô que há um bug (inseto em inglês) no sistema elétrico do metrô, logicamente fazendo uma referência ao jargão "bug".