几十个"分析:无效的弧标记"在Xcode 5中运行代码覆盖时

时间:2014-03-19 22:30:06

标签: ios objective-c xcode code-coverage

在Xcode 5中启用代码覆盖率运行我的Test目标时,我在构建输出中收到以下几条消息:

profiling:invalid arc tag (0x...)

它们似乎不会影响测试,因为它们成功完成,并且GCDA覆盖文件也按预期生成。

知道消息的含义,或者如何抑制消息/修复问题,因为它们会使构建输出变得混乱,并且很难找到测试用例结果。

6 个答案:

答案 0 :(得分:49)

这很可能是因为构建工具无法将当前结果合并到现有的.gcda coverage文件中。作为Dave Meehan points out here,有一种通过清理产品构建文件夹来解决这个问题的蛮力方法,但是一个不那么难的核心方法是从生成它们的目标中删除.gcda文件(对我来说,只是测试目标)作为构建过程的一部分。 Dave包含一个示例脚本,作为构建阶段包含在内 - 或者,在项目根目录中包含:

find . -name "*.gcda" -print0 | xargs -0 rm

答案 1 :(得分:31)

对于那里的Xcode 7用户,你可能想知道为什么你的单元测试在收到这样的消息后崩溃了。我发现的解决方案是你需要确保构建流程中涉及的所有可能目标(包括所有库)都应该将这两个构建设置设置为NO:

GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;

如果您在构建设置中搜索“代码生成”部分,您会发现这些内容为“生成测试覆盖率文件”和“仪器程序流程”。

有关详细信息,请参阅https://developer.apple.com/library/ios/qa/qa1514/_index.html

答案 2 :(得分:2)

我遇到了同样的问题。在appDelegate applicationWillTerminate:下的__gcov_flush();我有invalid arc tag。对此进行注释会删除构建输出中的DerivedData消息。

我正在做进一步的研究,以弄清楚为什么会发生这种情况。我知道如果我完全清理我的项目并删除#ifdef DEBUG + (void)initialize { [[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver" forKey:@"XCTestObserverClass"]; [super initialize]; } #endif 目录,这些消息将停止几次我的测试。

编辑:我似乎已经为我解决了这个问题。在我的appDelegate中,我有以下内容:

GcovTestObserver

我拼写XCTestObserver错了,修好后消息停止了。确保您的测试目标中还有一个stopObserving的子类覆盖- (void) stopObserving { [super stopObserving]; UIApplication* application = [UIApplication sharedApplication]; [application.delegate applicationWillTerminate:application]; } ,其中包含以下内容:

{{1}}

答案 3 :(得分:0)

您可能希望清除所有派生的数据文件夹。特别是如果您升级Xcode或使用多个Xcode版本。

有一段时间我在集成服务器中将Xcode从6.2升级到6.3之后就遇到了这种情况,我们在日志中看到了这些消息,并且在{}生成的覆盖率报告中看到了缺少的类{3}}。删除集成服务器中的DerivedData文件夹会修复它。

find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf

答案 4 :(得分:-2)

我花了一些时间试图弄清楚如何摆脱那些丑陋和恼人的消息:

  

profiling:/Users/appfactory/Desktop/WORK/App/trunk/ObjectiveC.gcda:   无法合并以前的GCDA文件:corrupt arc tag(0x00000000)

这似乎是当前Xcode 7.1 beta 2中没有修复的Xcode 7问题。

问题是由于未能将现有.gcda coverage文件与当前结果合并而导致的。

我尝试了什么:

  1. 使用RunScript删除这些.gcda文件 - 在我的情况下不起作用
  2.   

    echo"删除.gcda文件"回声   " $ {OBJECT_FILE_DIR_normal} / $ {CURRENT_ARCH}"

         

    注意:ObjectiveC.gcda文件可能位于不同的位置!

    1. 将以下构建设置设置为YES - 也没有帮助

      • 启用代码覆盖率支持为是

      • 将旧版测试覆盖率文件生成为“是”

      • 仪器程序流程为YES

    2. 我案例中的解决方案:

    3. 为主目标设置以下构建设置

      • 启用代码覆盖率支持为是

      • 将旧版测试覆盖率文件生成为“是”

      • 仪器程序流程为否

      为测试目标(以及任何其他目标)设置以下构建设置

      • 启用代码覆盖率支持

      • 生成旧版测试覆盖率文件

      • 仪器程序流程为否

      希望它有所帮助!

答案 5 :(得分:-2)

要解决在控制台中获取“无法合并以前的GCDA文件:corrupt arc tag”消息的问题,请避免生成ObjectiveC.gcda文件,方法是将“Enable Modules(C and Objective-C)”设置为“NO”,在目标设置中。