在Xcode 5中运行代码覆盖时,有数十个“性能分析:无效的弧标记”

在Xcode 5中启用代码覆盖范围的情况下运行testing目标时,在构build输出中会收到以下几十条消息:

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

它看起来不会影响testing,因为它们成功完成,而且GCDA覆盖率文件也按预期生成。

任何想法的信息意味着什么,或者如何抑制消息/解决问题,因为他们杂乱的生成输出,并很难findtesting用例的结果。

这很可能是由于构build工具无法将当前结果合并到现有.gcda coverage文件中的结果。 正如Dave Meehan在这里指出的那样 ,通过清理产品构build文件夹有一种强制性的方式来处理这个问题,但是一个不那么困难的核心方法是从产生它们的目标中删除.gcda文件(对于我来说,只是testing目标)作为构build过程的一部分。 Dave包含一个示例脚本,作为构build阶段 – 或者在项目根目录下:

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

对于那里的Xcode 7用户来说,你可能一直在想,为什么你的unit testing会在收到这样的消息之后崩溃。 我发现的解决scheme是,你需要确保你的构buildstream程中包含的所有可能的目标(包括所有库)应该将这两个构build设置设置为NO:

 GCC_GENERATE_TEST_COVERAGE_FILES = NO; GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO; 

如果您在构build设置中search“代码生成”部分,可以find这些“生成testing覆盖率文件”和“仪器程序stream程”。

有关进一步参考,请参阅https://developer.apple.com/library/ios/qa/qa1514/_index.html

老问题,但现在Xcode 7 GM已经出来了,这种行为没有改变,我深入了解了一下。 这个问题,我认为testing应用程序目标的代码覆盖率与主要目标的代码覆盖率相冲突。

假设您实际上并不关心testing目标的代码覆盖范围,那么这些设置将为我停止这些错误,而不需要额外的脚本或删除文件:

在您的主要目标(无论是框架还是应用程序)中设置:

  Enable Code Coverage Support to YES Generage Legacy Test Coverage Files to YES Instrument Program Flow to YES 

为了我的目的,我只对Debug版本做了这个,但是你的需求可能会有所不同。

然后在你的testing目标集中:

  Enable Code Coverage Support to NO Generage Legacy Test Coverage Files to NO Instrument Program Flow to NO 

这已经解决了错误信息,并且仍然允许适当地创build代码覆盖文件。

再一次,这个问题是旧的,但由于错误仍然在XCode 7中发出,我发现这个解决scheme比用特殊脚本删除文件更好。

我有同样的问题。 在我的__gcov_flush(); applicationWillTerminate:applicationWillTerminate:我有__gcov_flush(); 。 注释掉我的构build输出中的invalid arc tag消息。

我正在做进一步的研究,弄清楚为什么发生这种情况。 我知道,如果我完全清理我的项目,并删除DerivedData目录这些消息将停止几个我的testing运行。

编辑:我似乎已经解决了这个问题。 在我的appDelegate我有以下几点:

 #ifdef DEBUG + (void)initialize { [[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver" forKey:@"XCTestObserverClass"]; [super initialize]; } #endif 

我拼写错了GcovTestObserver ,并修复后,消息停止。 确保你的testing目标中还有一个XCTestObserver的子类,用下面的代码覆盖stopObserving

 - (void) stopObserving { [super stopObserving]; UIApplication* application = [UIApplication sharedApplication]; [application.delegate applicationWillTerminate:application]; } 

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

有一次,我在集成服务器中将Xcode从6.2升级到6.3后经历了这种情况,我们已经在日志中看到这些消息以及由frankencover.it生成的覆盖报告中的缺失类。 删除集成服务器中的DerivedData文件夹可以修复它。

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

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

分析:/Users/appfactory/Desktop/WORK/App/trunk/ObjectiveC.gcda:不能合并以前的GCDA文件:损坏的弧标记(0x00000000)

它似乎是一个Xcode 7问题,在当前的Xcode 7.1 beta 2中没有修复。

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

我试过的:

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

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

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

  1. 将以下版本设置设置为YES – 也没有帮助

    • 将代码覆盖支持启用为YES

    • 生成传统的testing覆盖率文件为YES

    • 仪器程序stream向YES

  2. 在我的情况下的解决scheme:

为主要目标设置以下构build设置

  • 将代码覆盖支持启用为YES

  • 生成传统的testing覆盖率文件为YES

  • 仪器程序stream向NO

为testing目标(和任何其他目标)设置以下构build设置

  • 启用代码覆盖支持到NO

  • 生成传统的testing覆盖文件到NO

  • 仪器程序stream向NO

希望能帮助到你!

为了解决控制台中“无法合并之前的GCDA文件:损坏的弧标记”消息的问题,避免生成ObjectiveC.gcda文件,通过在目标中将“启用模块(C和Objective-C)”设置为“NO”设置。