Gcov es una herramienta de análisis de cobertura de código fuente y elaboración de perfiles declaración por declaración . Gcov genera recuentos exactos de la cantidad de veces que se ejecuta cada instrucción en un programa y anota el código fuente para agregar instrumentación. Gcov viene como una utilidad estándar con la suite GNU Compiler Collection (GCC). [1]
Sistema operativo | Tipo Unix |
---|---|
Tipo | Cobertura de código |
Licencia | Licencia pública general GNU y otras licencias de software libre [ ¿cuál? ] |
Sitio web | gcc |
La utilidad gcov proporciona información sobre la frecuencia con la que un programa ejecuta segmentos de código. [2] Produce una copia del archivo fuente, anotado con frecuencias de ejecución. La utilidad gcov no produce ningún dato basado en el tiempo y solo funciona con código compilado con la suite GCC. El manual afirma que no es compatible con ningún otro mecanismo de cobertura de pruebas o elaboración de perfiles, [3] pero también funciona con archivos generados por llvm .
Descripción
gcov produce un análisis de cobertura de prueba de un programa especialmente instrumentado . Las opciones -fprofile-arcs -ftest-coverage
deben usarse para compilar el programa para el análisis de cobertura (la primera opción para registrar las estadísticas de la rama y la segunda para guardar el recuento de ejecución de la línea); -fprofile-arcs
también debe usarse para vincular el programa. [2] Después de ejecutar dicho programa, se crearán varios archivos con las extensiones ".bb" ".bbg" y ".da" (sufijos), que pueden ser analizados por gcov. Toma los archivos fuente como argumentos de la línea de comandos y produce una lista de fuentes anotada. Cada línea de código fuente tiene como prefijo el número de veces que se ha ejecutado; las líneas que no se han ejecutado tienen el prefijo "#####". [2]
gcov crea un archivo de registro llamado sourcefile.gcov que indica cuántas veces se ha ejecutado cada línea de un archivo fuente sourcefile.c . Este archivo fuente anotado se puede utilizar con gprof , otra herramienta de creación de perfiles, para extraer información de tiempo sobre el programa.
Ejemplo
El siguiente programa, escrito en lenguaje de programación C , recorre los números enteros del 1 al 9 y prueba su divisibilidad con el operador de módulo (%).
#include int main ( vacío ) { int i ; for ( i = 1 ; i < 10 ; i ++ ) { if ( i % 3 == 0 ) printf ( "% d es divisible por 3 \ n " , i ); if ( i % 11 == 0 ) printf ( "% d es divisible por 11 \ n " , i ); } return 0 ; }
Para habilitar la prueba de cobertura, el programa debe compilarse con las siguientes opciones:
$ gcc -Wall -fprofile-arcs -ftest-cobertura cov.c
donde cov.c es el nombre del archivo de programa. Esto crea un ejecutable instrumentado que contiene instrucciones adicionales que registran el número de veces que se ejecuta cada línea del programa. La opción -ftest -cover agrega instrucciones para contar el número de veces que se ejecutan líneas individuales, mientras que -fprofile-arcs incorpora código de instrumentación para cada rama del programa. La instrumentación de rama registra la frecuencia con la que se toman diferentes rutas a través de declaraciones "si" y otros condicionales. El ejecutable debe entonces ser ejecutado para crear los datos de cobertura. Los datos de la ejecución se escriben en varios archivos con las extensiones '.bb' '.bbg' y '.da' respectivamente en el directorio actual . Estos datos se pueden analizar usando el comando gcov y el nombre de un archivo fuente:
$ gcov cov.c 88.89% de 9 líneas fuente ejecutadas en el archivo cov.c Creando cov.c.gcov
El comando gcov produce una versión anotada del archivo fuente original , con la extensión de archivo '.gcov', que contiene recuentos del número de veces que se ejecutó cada línea:
#include int main ( vacío ) { 1 int i ; 10 para ( i = 1 ; i < 10 ; i ++ ) { 9 si ( i % 3 == 0 ) 3 printf ( "% d es divisible por 3 \ n " , i ); 9 if ( i % 11 == 0 ) ###### printf ("% d es divisible por 11 \ n", i); 9 } 1 return 0 ; 1 }
Los recuentos de líneas se pueden ver en la primera columna de la salida. Las líneas que no se ejecutaron se marcan con hash '######'.
Opciones de línea de comando
La utilidad de línea de comandos de Gcov admite las siguientes opciones al generar archivos anotados a partir de datos de perfil: [4] [5]
- -h ( --help ): muestra ayuda sobre el uso de gcov (en la salida estándar) y sale sin realizar ningún procesamiento adicional.
- -v ( --version ): muestra el número de versión de gcov (en la salida estándar) y sale sin realizar ningún procesamiento adicional.
- -a ( --todos los bloques ): escribe recuentos de ejecución individuales para cada bloque básico. Normalmente, la ejecución de las salidas de gcov cuenta solo para los bloques principales de una línea. Con esta opción puede determinar si los bloques dentro de una sola línea no se están ejecutando.
- -b ( --branch-probabilities ): escribe frecuencias de rama en el archivo de salida y escribe información de resumen de rama en la salida estándar. Esta opción le permite ver la frecuencia con la que se tomó cada rama de su programa. Las ramas incondicionales no se mostrarán, a menos que se proporcione la opción -u.
- -c ( --branch-count ): escribe las frecuencias de las sucursales como el número de sucursales tomadas, en lugar del porcentaje de sucursales tomadas.
- -n ( --no-output ): no crea el archivo de salida gcov.
- -l ( --long-file-names ): crea nombres de archivo largos para los archivos de origen incluidos. Por ejemplo, si el archivo de encabezado xh contiene código y se incluyó en el archivo ac, ejecutar gcov en el archivo ac producirá un archivo de salida llamado ac ## xhgcov en lugar de xhgcov. Esto puede resultar útil si xh está incluido en varios archivos de origen y desea ver las contribuciones individuales. Si usa la opción `-p ', tanto el nombre de archivo incluido como el incluido serán nombres de ruta completos.
- -p ( --preserve -path ): conserva la información completa de la ruta en los nombres de los archivos .gcov generados. Sin esta opción, solo se utiliza el componente de nombre de archivo. Con esta opción, se utilizan todos los directorios, con los caracteres `/ 'traducidos a caracteres` #',. componentes de directorio eliminados e inamovibles .. componentes renombrados a `^ '. Esto es útil si los archivos fuente están en varios directorios diferentes.
- -r ( --relative-only ): solo genera información sobre archivos de origen con un nombre de ruta relativo (después de la elisión del prefijo de origen). Las rutas absolutas suelen ser archivos de encabezado del sistema y la cobertura de cualquier función en línea en ellos no suele ser interesante.
- -f ( --function-summaryies ): resúmenes de salida para cada función además del resumen a nivel de archivo.
- -o directorio | archivo ( --directorio -directorio-objeto o -archivo-archivo-objeto ): especifique el directorio que contiene los archivos de datos gcov o el nombre de la ruta del objeto. Los archivos de datos .gcno y .gcda se buscan mediante esta opción. Si se especifica un directorio, los archivos de datos están en ese directorio y se nombran después del nombre del archivo de entrada, sin su extensión. Si se especifica un archivo aquí, los archivos de datos reciben el nombre de ese archivo, sin su extensión.
- -s directorio ( --source-prefix directory ): un prefijo para los nombres de los archivos de origen que se eliminarán al generar los archivos de cobertura de salida. Esta opción es útil cuando se crea en un directorio separado y no se desea el nombre de la ruta al directorio de origen al determinar los nombres de los archivos de salida. Tenga en cuenta que esta detección de prefijo se aplica antes de determinar si el archivo de origen es absoluto.
- -u ( --unconditional-branch ): cuando se dan probabilidades de rama, incluya las de ramas incondicionales. Las ramas incondicionales normalmente no son interesantes.
- -d ( --display-progress ): muestra el progreso en la salida estándar.
Resúmenes de cobertura
Lcov es una interfaz gráfica para gcov. Recopila datos de gcov para varios archivos fuente y crea páginas HTML que contienen el código fuente anotado con información de cobertura. También agrega páginas de descripción general para una fácil navegación dentro de la estructura de archivos. Lcov admite mediciones de cobertura de sucursales, funciones y declaraciones. [6] También existe una versión para Windows.
Gcovr proporciona una utilidad para administrar el uso de gcov y generar resultados resumidos de cobertura de código. Este comando está inspirado en el paquete Cobertura.py de Python, que proporciona una utilidad similar en Python. Gcovr produce informes resumidos compactos legibles por humanos, informes XML legibles por máquina o un resumen HTML gráfico. Los informes XML generados por gcovr puede ser utilizado por Jenkins para proporcionar resúmenes de cobertura de código gráfico. Gcovr admite la medición de cobertura de sucursales y declaraciones [7]
SCov es una utilidad que procesa el formato de texto intermedio generado por gcov (usando gcov -i) para generar informes sobre la cobertura del código. Estos informes pueden ser un informe de texto simple o páginas HTML con informes más detallados. [8]
Ver también
Referencias
- ^ "Cómo funciona Gcov-herramienta parte de GCC" (PDF) . Archivado desde el original (PDF) el 9 de abril de 2014 . Consultado el 12 de febrero de 2012 . Cite journal requiere
|journal=
( ayuda ) - ^ a b c Brian J. Gough. Una introducción a GCC - para los compiladores GNU gcc y g ++ - Prueba de cobertura con gcov . Consultado el 12 de febrero de 2012 .
- ^ "página de manual de gcov" . Consultado el 12 de febrero de 2012 .
- ^ gnu.org. "Opciones de línea de comandos de Gcov" . Consultado el 11 de febrero de 2012 .
- ^ comandos de linux. "Opciones de línea de comandos de Gcov" . Archivado desde el original el 8 de enero de 2013 . Consultado el 12 de febrero de 2012 .
- ^ "Lcov" .
- ^ "Gcovr" .
- ^ "SCov" .