Gcov

gcov
Sistema operacional Unix-like
Gênero(s) Cobertura de código
Licença GNU General Public License
Página oficial gcc.gnu.org/onlinedocs/gcc/Gcov.html

Gcov é uma ferramenta de análise de cobertura de código fonte e de criação de perfil por instruções passo-a-passo. Gcov gera contagens exatas do número de vezes que cada instrução em um programa é executada e anota o código-fonte para adicionar instrumentação. Gcov vem como um utilitário padrão com o pacote GNU Compiler Collection (GCC).[1]

O utilitário gcov fornece informações sobre a frequência com que um programa executa segmentos de código. Ele produz uma cópia do arquivo fonte, anotado com as frequências de execução. O utilitário gcov não produz quaisquer dados baseados em tempo, e só funciona em código compilado com o pacote GCC. O manual afirma que ele não é compatível com qualquer outro perfil ou mecanismo de cobertura de testes,[2] mas ele funciona também com arquivos gerados pelo llvm.

gcov produz uma análise de cobertura de teste de um programa especialmente instrumentado. As opções -fprofile-arcs -ftest-covegare devem ser usadas para compilar o programa para análise de cobertura (a primeira opção para registrar estatísticas de ramificação e a segunda para salvar a contagem de execuções das linhas); -fprofile-arcs também deve ser usado para vincular o programa. Após executar esse programa, serão criados vários arquivos com extensões ".bb" ".bbg" e ".da" (sufixos), que podem ser analisados pleo gcov. Ele usa arquivos de origem como argumentos de linha de comando e produz um listagem anotada de fontes. Cada linha do código-fonte é prefixada com o número de vezes que foi executada; as linhas que não foram executadas são prefixadas com "#####".[3]

gcov cria um arquivo de registro chamado sourcefile.gcov que indica quantas vezes cada linha de um arquivo de origem sourcefile.c foi executada. Este arquivo de origem anotado pode ser usado com o gprof, outra ferramenta de análise para extrair informações de temporização sobre o programa.

O programa a seguir, escrito em linguagem de programação C, itera sobre os inteiros de 1 a 9 e testa a sua divisibilidade com o operador módulo (%).

#include <stdio.h>

int
main (void)
{
  int i;

  for (i = 1; i < 10; i++)
    {
      if (i % 3 == 0)
        printf ("%d é divisível por 3\n", i);
      if (i % 11 == 0)
        printf ("%d é divisível por 11\n", i);
    }

  return 0;
}

Para ativar a cobertura de testes, o programa deve ser compilado com as seguintes opções:

gcc -Wall -fprofile-arcs -ftest-coverage cov.c

onde cov.c é o nome do arquivo do programa. Isso cria um executável instrumentado que contém instruções adicionais que registram o número de vezes que cada linha do programa é executada. A opção -ftest-coverage adiciona instruções para contar o número de vezes que linhas individuais são executadas, enquanto -fprofile-arcs incorpora instrumentação de código para cada ramificação do programa. A instrumentação de ramificação registra a frequência com que diferentes caminhos são obtidos pelas instruções de decisão ‘if’ e outras estruturas condicionais. O executável deve então ser executado para criar os dados de cobertura. Os dados da execução são escritos para vários arquivos com as extensões ‘.bb’ ‘.bbg’ e ‘.da’ respectivamente no diretório atual. Esses dados podem ser analisados usando o comando gcov e o nome de um arquivo de origem:

gcov cov.c
 88.89% of 9 source lines executed in file cov.c
Creating cov.c.gcov

O comando gcov command produz uma versão anotada do arquivo fonte original, com a extensão de arquivo ‘.gcov’, contendo contagens do número de vezes que cada linha foi executada:

        #include <stdio.h>

        int
        main (void)
        {
     1    int i;

    10    for (i = 1; i < 10; i++)
            {
     9        if (i % 3 == 0)
     3          printf ("%d é divisível por 3\n", i);
     9        if (i % 11 == 0)
######          printf ("%d é divisível por 11\n", i);
     9      }

     1    return 0;
     1  }

As contagens de linha podem ser vistas na primeira coluna da saída. Linhas que não foram executadas são marcadas com cerquilhas '######'.

Opções de linha de comando

[editar | editar código-fonte]

O utilitário de linha de comando Gcov suporta as seguintes opções ao gerar arquivos anotados dos dados de perfil:[4][5]

  • -h (--help): Exibe a ajuda sobre o uso do gcov (na saída padrão), e sai sem fazer qualquer processamento adicional.
  • -v (--version): Exibe o número de versão do gcov (na saída padrão), e sair sem faze qualquer processamento adicional.
  • -a (--all-blocks): Escreve as contagens individuais de execução para cada bloco básico. Normalmente, a execução das saídas gcov conta apenas para os blocos principais de uma linha. Com esta opção, você pode determinar se os blocos dentro de uma única linha não estão sendo executados.
  • -b (--branch-probabilities): Escreve frequências de ramificação para o arquivo de saída e grava informações de resumo de ramificação na saída padrão. Esta opção permite ver com que frequência cada ramificação do seu programa foi executada. As ramificações incondicionais não serão mostradas, a menos que a opção -u seja fornecida.
  • -c (--branch-counts): Escreva as frequências das ramificações como o número de ramificações tiradas, em vez da porcentagem de ramificações tiradas.
  • -n (--no-output): Não cria o arquivo de saída gcov.
  • -l (--long-file-names): Crie nomes longos de arquivos para os arquivos fonte incluídos. Por exemplo, se o arquivo de cabeçalho x.h contém código, e foi incluído em um arquivo a.c, então executando o gcov com o arquivo a.c irá produzir um arquivo de saída chamado a.c##x.h.gcov em vez de x.h.gcov. Isto pode ser útil se x.h está incluído em vários arquivos fonte e se você quiser ver as contribuições individuais. Se você usar a opção `-p', ambos os nomes de arquivos incluídos serão nomes de caminho completos.
  • -p (--preserve-paths): Preserve informações completas do caminho nos nomes dos arquivos .gcov. Sem esta opção, apenas o componente do nome de arquivo é usado. Com esta opção, todos os diretórios que são usados, com `/' caracteres traduzidos para caracteres `#', `.' componentes de diretório removidos e não removíveis `..' componentes renomeados para `^'. Isto é útil se arquivos fontes existem em vários diretórios diferentes.
  • -r (--relative-only): Apenas informações de saída sobre arquivos fonte com um nome de caminho relativo (após a elisão do prefixo do fonte). Caminhos absolutos são geralmente arquivos de cabeçalho do sistema e a cobertura de quaisquer funções embutidas normalmente é desinteressante.
  • -f (--function-summaries): Resumos de saída para cada função em conjunto com o arquivo de resumo de nível.
  • -o diretório|arquivo (--object-directory diretório ou --object-file arquivo): Especifica o diretório que contém os arquivos de dados do gcov ou o nome de caminho do objeto. os arquivos de dados .gcno e .gcda são pesquisados para usar esta opção. Se um diretório for especificado, os arquivos de dados que estão nesse diretório são nomeados após o nome do arquivo de entrada, sem a sua extensão. Se um arquivo for especificado aqui, os arquivos de dados são o nome do arquivo sem a extensão.
  • -s directory (--source-prefix diretório): Um prefixo de nomes de arquivo fonte para serem removidos ao gerar a cobertura dos arquivos de saída. Esta opção é útil ao compilar em um diretório separado, e o nome do caminho para o diretório de origem não é desejado ao determinar os nomes dos arquivos de saída. Observe que essa detecção de prefixo é aplicada antes de determinar se o arquivo de origem é absoluto.
  • -u (--unconditional-branches): Quando as probabilidades das ramificações são dadas, incluem aquelas de ramificação incondicional incondicional. Ramificações incondicionais normalmente não são interessantes.
  • -d (--display-progress): Exibe o progresso na saída padrão.

Cobertura de Resumos

[editar | editar código-fonte]

Lcov é uma interface gráfica para o gcov. Ele coleta dados do gcov para vários arquivos fonte e cria páginas HTML contendo o código-fonte anotado com informações de cobertura. Ele também adiciona páginas de visão geral para facilitar a navegação pela estrutura de arquivos. Lcov suporta declaração, função, e medição de cobertura de ramificação.[6] Há também uma versão para Windows.

Gcovr fornece um utilitário para gerenciar o uso do gcov e gerar resumos dos resultados de cobertura de código. Esse comando é inspirado no pacote Python coverage.py, que fornece um utilitário semelhante no Python. O Gcovr produz relatórios resumidos compactos e legíveis por humanos, relatórios em XML legíveis por máquina ou um resumo gráfico em HTML. Os relatórios XML gerados pelo gcovr podem ser usados ​​pelo Jenkins para fornecer resumos gráficos de cobertura de código. O Gcovr suporta declaração e medição de cobertura de ramificação[7]

  • Tcov – ferramenta de cobertura de código para Solaris fornecida no pacote Sun Studio

Referências

  1. «How Gcov works-tool part of GCC» (PDF). Consultado em 22 de julho de 2018. Arquivado do original (PDF) em 9 de abril de 2014 
  2. «gcov man page» 
  3. Brian J. Gough. An Introduction to GCC - for the GNU compilers gcc and g++ - Coverage testing with gcov. [S.l.: s.n.] 
  4. «Gcov Command line options» 
  5. «Gcov Command line options». Consultado em 22 de julho de 2018. Arquivado do original em 8 de janeiro de 2013 
  6. «Lcov» 
  7. «Gcovr»