【问题标题】:Code coverage with Xcode 4.2 - Missing filesXcode 4.2 的代码覆盖率 - 缺少文件
【发布时间】:2012-02-02 16:20:12
【问题描述】:

我跟随 Claus's post 在 Xcode 4.2 上使用 LLVM 3.0 设置代码覆盖率。我能够看到测试覆盖率文件,但它们仅适用于我的单元测试类,而不是我的实际项目类。我尝试在我的主要目标上将 Generate Test Coverage FilesInstrument Program Flow 设置为 Yes,但这并没有帮助,因为它失败并出现以下错误:

从函数 llvm_gcda_start_file 调用的 fopen$UNIX2003

澄清一下,我认为这甚至不是正确的方法 - 我只是尝试了一下,看看它是否会在我的项目类上生成代码覆盖率。

此时,我很乐意尝试任何可以在我的应用上运行代码覆盖的方法。有什么建议吗?

【问题讨论】:

    标签: ios xcode code-coverage


    【解决方案1】:

    我为 .gcda.gcno 文件使用 CoverStory http://code.google.com/p/coverstory/ 一个 GUI。

    文档解释了生成这些文件http://code.google.com/p/coverstory/wiki/UsingCoverstory 所需的设置。

    【讨论】:

    • CoverStory 非常适合我。在 XCode 4.5 上启用代码覆盖非常简单,无需添加额外的库。
    【解决方案2】:

    您期待链接器问题,profile_rt 库使用 fopen$UNIX2003fwrite$UNIX2003 函数而不是 fopenfwrite

    您只需将以下.c 文件添加到您的项目中:

    #include <stdio.h>
    
    FILE *fopen$UNIX2003( const char *filename, const char *mode )
    {
        return fopen(filename, mode);
    }
    
    size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
    {
        return fwrite(a, b, c, d);
    }
    

    此代码只是将缺少的函数重新映射到标准函数。

    注意$UNIX2003后缀:

    我发现一个Apple document 说:

    UNIX™ 一致性变体使用 $UNIX2003 后缀。

    重要提示:UNIX™ 一致性工作始于 Mac OS 10.4,但直到 10.5 才完成。因此,在 libSystem.dylib 的 10.4 版本中,存在许多一致的变体符号(带有 $UNIX2003 后缀)。列表不完整,变体符号的符合行为可能不完整,应避免使用。

    因为 64 位环境没有需要维护的遗产,所以它从一开始就被创建为符合 UNIX™,没有使用 $UNIX2003 后缀。因此,例如,32 位的 _fputs$UNIX2003 和 64 位的 _fputs 将具有相同的一致性行为。

    所以我希望 libprofile_rt 与 10.4 SDK 相关联。

    【讨论】:

    • 在 XCode 4.3.2 中将此 .c 文件添加到我的项目并为我的主要目标(仅调试)打开覆盖和检测工作!这是我第一次拥有用于 iOS 开发的全功能代码覆盖。我什至使用 gcovr 和 Coburtura 插件将它与 Jenkins 集成。
    • 这对我来说 99% 的时间都有效,但我仍然随机崩溃。有什么想法吗?我们的测试框架将重启应用程序 100 次。在夜间运行时,它总是会发生,但非常间歇性
    • @BrianKing 您可能应该提交一个单独的问题,其中包含有关您的崩溃的详细信息。
    • 这是一个旧线程。但这个答案拯救了我的一天!为 iOS8 编译 LevelDB 库时遇到问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2016-08-11
    • 2016-11-29
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多