15

我在 10.6 上使用 Xcode 3.2,带有 gcov 的出厂版本和默认的 GCC 编译器(均为 4.2.1 版本)。我创建了一个依赖 Cocoa 单元测试包,该包被注入到我的应用程序中,并遵循 Apple 的关于设置 gcov-instrumented 构建配置的文档- 基于未启用任何编译器优化的调试配置。

当我使用这种“Gcov-instrumented”配置构建测试包时,应用程序启动并且测试被注入并运行。覆盖统计文件也在以下位置生成:

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcda

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcno

到现在为止还挺好。我知道测试确实在运行,因为如果我插入失败,那么测试套件会按预期失败。不幸的是,gcov 报告说测试没有覆盖任何对象行!每一行都报告为 0 覆盖率。我在此处和 Apple 邮件列表档案中进行了搜索,但找不到任何有类似问题的人。我希望我错过了一些东西 - 但它是什么?

4

5 回答 5

10

我一直在间歇性地遇到这个问题。我偶然发现了一段很长的幸运时间,在我的主要项目中“大部分时间都在工作”。通过大部分时间工作,我的意思是我能够获得报道,但比 10.5 更痛苦。例如,我不得不积极地删除覆盖文件并重建以获得任何更新。即使在我“勉强工作”的状态下,编译器/运行时似乎也不愿意覆盖现有的覆盖数据文件。

我想我偶然发现了一个工作场景。Voodoo 是肯定的,但不太理想:

  1. 确保 SDK 为 10.6。
  2. 确保部署设置为 gcc 4.0 (!)。
  3. 对项目进行全面清理。
  4. 重建。

这是否为您提供了预期的覆盖率数据?

诚然,我希望能够生成使用 gcc 4.2 或 LLVM 编译器之一工作的覆盖文件,但目前这似乎让我比以前稍微少了一点残废。

另一个线索:当我观察覆盖数据时(使用 Google 的Cover Story),我收到如下警告:

/BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects-normal/i386/MEDataItem.gcno:version '400A',更喜欢 '402*'

但仍会显示覆盖信息。因此,它似乎对较旧的覆盖格式版本犹豫不决,但如果我使用可能会生成较新格式.gcno文件的较新编译器 (4.2),0% 覆盖问题困扰着我,就像 Graham 一样。

于 2009-10-12T17:10:19.823 回答
7

在 Xcode 4.6 中,覆盖率报告似乎可以正常工作。为应用程序目标打开“生成测试覆盖文件”和“仪器程序流程”,运行测试,然后将覆盖工具指向输出。那是在~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.build;在 CoverStory 中打开该文件夹会显示我预期的结果。

这个 GitHub 存储库包含可以自动发现输出并让 lcov 将其可视化的脚本;我现在对 CoverStory 很满意。

于 2013-01-29T13:57:14.327 回答
2

您可以使用 gcc 4.2.1 获得代码覆盖率。详情在这里:

雪豹GCov

于 2010-06-01T22:25:15.703 回答
0

我一直在尝试让代码覆盖率适用于 iPhone 模拟器,并且始终获得 0% 的覆盖率。以下是我尝试过的配置详细信息和步骤。

配置

Xcode 3.2.5/iOS 4.1 和 iOS 4.2/Mac 10.6/GCC 4.2 应用程序 UICatalog

参考

http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/

http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html

脚步

  • 启用“生成测试覆盖文件”</li>
  • 启用“仪器程序流程”</li>
  • 将“-lgcov”添加到“其他链接器标志”</li>
  • Info.plist 中的 UIApplicationExitsOnSuspend 标志设置为 true

结果

我生成了 .gcda 文件,但覆盖率始终显示为 0%。

尝试设置

  1. 将 GCC 更改为 4.0 和 4.2。当我尝试将 GCC 更改为 4.0 时,出现 26 个构建错误。
  2. 设置环境变量:

    const char *prefix = "GCOV_PREFIX";
    const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory
    const char *prefixStrip = "GCOV_PREFIX_STRIP";
    const char *prefixStripValue = "1";
    setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
    setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
    
  3. GCC 优化设置为无 (-O0) 并取消选中预编译前缀头文件标志。
于 2011-02-24T06:03:28.220 回答
0

当静态库的 *.gcno 文件被共享库的文件覆盖时,我的覆盖率为 0。

于 2011-09-21T20:58:21.093 回答