Pregunta ¿Cómo se generan los archivos xml del formato Cobertura con gcovr para iOS?


Estoy generando archivos de datos de cobertura de código (.gdca y .gcno) en un proyecto de iOS que se ejecuta en Xcode 4.5 utilizando Apple LLVM Compiler 4.1.

Los archivos se están generando en Biblioteca / Desarrollador / Xcode / DerivedData / viewer-evgaabclrjcouydwveuptwroeofm / Build / Intermediates / viewer.build / Coverage-iphonesimulator / viewer_generic / viewer_generic.build / Objects-normal / i386.

Todos los archivos (.o, .d, .dia, .gcda, .gdno) están debajo de este directorio. No hay subcarpetas.

Puedo abrir archivos .gcda individuales utilizando Cover Story. Ahora quiero generar un informe que se pueda ver usando cobertura.

Estoy tratando de usar gcovr para esto. En la terminal llegué a la carpeta de arriba

Command: gcovr -r `pwd` -x -v

Output:
(Several lines of similar output as below)
Running gcov: 'gcov /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386/FILE_NAME.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386' in '/Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386'
    Parsing coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm
    Filtering coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm
    Gathered coveraged data for 0 files
    <?xml version="1.0" ?>
    <!DOCTYPE coverage
      SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
    <coverage branch-rate="0.0" line-rate="0.0" timestamp="1354144430" version="gcovr 2.4 (r2774)">
        <sources>
            <source>
                /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386
            </source>
        </sources>
        <packages/>
    </coverage>

Estoy viendo una advertencia: gcno: versión '404', prefiero '402'

Ayúdame a descubrir por qué gcovr no puede generar el informe.


5
2017-11-28 23:20


origen


Respuestas:


Tl; dr: los archivos de cobertura de código que LLVM genera son más nuevos que los esperados por gcovr. Si reemplaza su versión de gcovr con la versión vinculada (versión 2.4), entonces debería funcionar. Tal vez. 

Antes de LLVM, Xcode usó GCC como su compilador. GCC incluyó una herramienta llamada 'gcov', que generó todos esos archivos, .gcno, .gcda y sus archivos.

En aquel entonces, los Mac venían preinstalados (y aún lo hacen) con la versión 4.2 de GCC. Entonces, Xcode compilaría su proyecto con gcc 4.2 y luego ejecutaría la versión 4.2 de gcov, lo que generaría archivos de cobertura de prueba con versión 4.2. Esto funcionó bien para gcovr, porque la versión alfa pre-2.0 parece haber sido escrita teniendo en cuenta gcov 4.2.

Pero cuando Apple cambió a LLVM, las cosas se pusieron feas. LLVM también genera archivos de cobertura de prueba de estilo gcov, si establece la marca "Generar archivos de cobertura de prueba" en su configuración de destino. PERO, LLVM se predetermina a la salida de archivos 4.4 de gcov, NO 4.2.

Ésta persona Tuvimos la idea de que si podíamos decirle a LLVM que generara la versión 4.2 de los archivos (creo que técnicamente podría hacerlo), entonces resolvería el problema. Probablemente sea cierto, pero no sé cómo hacerlo.

Sin embargo, encontré una solución para mí. Abrí la terminal y revisé mi versión de gcovr:

gcovr --version

Me dijo que mi versión de gcovr era en realidad gcovr 2.0-prelanzamiento. Esta versión no admite las versiones de gcov 4.4 de los archivos de cobertura de prueba.

Entonces encontré una versión que sí.

Aquí está la página donde está alojado: https://software.sandia.gov/trac/fast/wiki/gcovr

Y aquí está el enlace al script en sí: https://software.sandia.gov/trac/fast/export/2800/gcovr/trunk/scripts/gcovr

Este script es gcovr 2.4, que admite hasta gcc 4.8. Teóricamente, debería ser bastante feliz con las versiones 4.4 de los archivos de cobertura de prueba que entrega LLVM. Esa advertencia ahora se ha ido por completo para mí. ¡Pruébalo, házmelo saber cómo va!


6
2017-12-11 17:58



¿Está especificando correctamente la ruta del directorio de objetos? De acuerdo con la documentación de gcovr

--object-directory = OBJDIR: Especifique el directorio que contiene los archivos de datos gcov. gcovr debe poder identificar la ruta entre los archivos * .gcda y el directorio donde se ejecutó originalmente gcc. Normalmente, gcovr puede adivinar correctamente. Esta opción anula la detección de ruta normal de gcovr y puede especificar la ruta de gcc al archivo gcda (es decir, qué se pasó a la opción '-o' de gcc) o la ruta desde el archivo gcda al directorio de trabajo original de gcc.

El siguiente comando funciona para mí cuando se ejecuta bajo el directorio raíz de su proyecto.

gcovr -r. --object-directory path_to_coverage_files -x> coverage.xml

Donde los path_to_coverage_files es el directorio donde están todos sus archivos (.o, .d, .dia, .gcda, .gdno).


1
2017-07-09 15:37