5

我正在使用 Apple LLVM Compiler 4.1 在 Xcode 4.5 上运行的 iOS 项目上生成代码覆盖率数据文件(.gdca 和 .gcno)。

正在 Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386 下生成文件。

所有(.o、.d、.dia、.gcda、.gdno)文件都在这个目录下。没有子文件夹。

我可以使用封面故事打开单个 .gcda 文件。现在我想生成一个可以使用 cobertura 查看的报告。

我正在尝试为此使用 gcovr。在终端上我到了上面的文件夹

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>

我看到一个警告:gcno:version '404', prefer '402'

请帮我弄清楚为什么 gcovr 无法生成报告。

4

2 回答 2

6

Tl;dr:LLVM 输出的代码覆盖率文件比 gcovr 预期的要新。如果您将 gcovr 版本替换为链接版本(2.4 版),那么它应该可以工作。也许。

早在 LLVM 之前,Xcode 使用 GCC 作为其编译器。GCC 包含一个名为“gcov”的工具,它生成所有这些文件,.gcno、.gcda 及其类似文件。

那时,Mac 预装了(现在仍然这样)GCC 4.2 版。所以 Xcode 会用 gcc 4.2 编译你的项目,然后运行 ​​gcov 4.2 版本,这将生成 4.2 版本的测试覆盖文件。这适用于 gcovr,因为 2.0 之前的 alpha 版本似乎是在考虑 gcov 4.2 的情况下编写的。

但是当 Apple 转向 LLVM 时,事情就变得很奇怪。如果您在目标设置中设置了“生成测试覆盖率文件”标志,LLVM 还会输出 gcov 样式的测试覆盖率文件。但是,LLVM 默认输出 gcov 4.4 文件,而不是 4.2。

这个人的想法是,如果我们可以告诉 LLVM 输出 4.2 版本的文件(我认为它在技术上可以做到),那么它就会解决问题。这可能是真的,但我不知道该怎么做。

但是,我确实为自己找到了解决方案。我打开终端,检查我的 gcovr 版本:

gcovr --version

它告诉我我的 gcovr 版本实际上是 gcovr 2.0-prerelease。此版本不支持测试覆盖文件的 gcov 4.4 版本。

所以我找到了一个版本。

这是托管它的页面:https ://software.sandia.gov/trac/fast/wiki/gcovr

这是脚本本身的链接:https ://software.sandia.gov/trac/fast/export/2800/gcovr/trunk/scripts/gcovr

这个脚本是gcovr 2.4,最高支持gcc 4.8。从理论上讲,它应该对 LLVM 输出的 4.4 版本的测试覆盖率文件感到非常满意。这个警告现在对我来说完全消失了。试一试,告诉我进展如何!

于 2012-12-11T17:58:30.333 回答
1

您是否正确指定了对象目录路径?根据 gcovr 文档

--object-directory=OBJDIR:指定包含 gcov 数据文件的目录。gcovr 必须能够识别 *.gcda 文件和 gcc 最初运行的目录之间的路径。通常,gcovr 可以正确猜测。此选项覆盖 gcovr 的正常路径检测,并且可以指定从 gcc 到 gcda 文件的路径(即传递给 gcc 的 '-o' 选项的路径),或从 gcda 文件到 gcc 原始工作目录的路径。

在项目的根目录下运行时,以下命令对我有用。

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

path_to_coverage_files 是所有(.o、.d、.dia、.gcda、.gdno)文件所在的目录。

于 2013-07-09T15:37:05.183 回答