Ios6 如何使用gcovr for iOS生成Cobertura格式的xml文件?

Ios6 如何使用gcovr for iOS生成Cobertura格式的xml文件?,ios6,code-coverage,Ios6,Code Coverage,我正在使用Apple LLVM编译器4.1在Xcode 4.5上运行的iOS项目上生成代码覆盖率数据文件(.gdca和.gcno) 文件是在Library/Developer/Xcode/DerivedData/viewer evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.Build/Coverage-iphonesimulator/viewer\u generic/viewer\u generic.Build/Objects-no

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

文件是在Library/Developer/Xcode/DerivedData/viewer evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.Build/Coverage-iphonesimulator/viewer\u generic/viewer\u 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>
命令:gcovr-r`pwd`-x-v
输出:
(以下几行输出类似)
运行gcov:'gcov/Users/abc/Library/Developer/Xcode/DerivedData/viewer evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.Build/Coverage-iphonesimulator/viewer\u generic.Build/Objects-normal/i386/FILE\u NAME.gcda--分支计数--分支概率--保留路径--对象目录/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”
解析文件/用户/abc/Documents/Performance/DPS MacBookPro/depot/sandbox/Viewer Labatt/Blue/Viewer/ipadviewer/iphone/apps/Viewer/Classes/view/zooming/file_NAME.mm的覆盖率数据
过滤文件/用户/abc/Documents/Performance/DPS MacBookPro/depot/sandbox/Viewer Labatt/Blue/Viewer/ipadviewer/iphone/apps/Viewer/Classes/view/zooming/file_NAME.mm的覆盖率数据
已收集0个文件的覆盖数据
/Users/abc/Library/Developer/Xcode/DerivedData/viewer evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.Build/Coverage-iphonesimulator/viewer\u generic/viewer\u generic.Build/Objects-normal/i386
我看到一个警告:gcno:version“404”,更喜欢“402”


请帮我找出gcovr无法生成报告的原因。

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

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

当时,Mac是用GCC版本4.2预装的(现在仍然如此)。所以Xcode将使用GCC4.2编译您的项目,然后运行GCOVVersion4.2,这将生成4.2版本的测试覆盖率文件。这对gcovr很有效,因为2.0之前的alpha版本似乎是在考虑GCOV4.2的情况下编写的

但当苹果转向LLVM时,一切都变得混乱起来。如果在目标设置中设置“生成测试覆盖率文件”标志,LLVM还输出gcov样式的测试覆盖率文件。但是,LLVM默认输出GCOV4.4文件,而不是4.2文件

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

然而,我确实为自己找到了解决办法。我打开终端,检查我的gcovr版本:

gcovr --version
它告诉我,我的gcovr版本实际上是gcovr2.0-prerelease此版本不支持测试覆盖率文件的gcov 4.4版本。

所以我找到了一个版本

以下是它所在的页面:

下面是脚本本身的链接:


这个脚本是gcovr2.4,它最多支持gcc4.8。理论上,它应该对LLVM输出的测试覆盖率文件的4.4版本感到非常满意。这一警告现在对我来说已经完全消失了。试试看,让我知道进展如何

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

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

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

gcovr-r--对象目录路径到覆盖率文件-x>coverage.xml


其中,指向覆盖率文件的路径是所有(.o、.d、.dia、.gcda、.gdno)文件所在的目录。

Hi,您能做到这一点吗?这如何回答问题?这全面回答了问题。答案不仅解释了如何绕过警告,还解释了警告存在的原因。@Gardner感谢信任投票。丹尼尔,你说得对,答案并不十分简洁。我在顶部添加了一个简短版本。