在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覆盖率文件与当前结果而导致的。
我试过的:
- 用RunScript删除这些.gcda文件 – 在我的情况下不起作用
回声“删除.gcda文件”echo“$ {OBJECT_FILE_DIR_normal} / $ {CURRENT_ARCH}”
注意:ObjectiveC.gcda文件可能位于不同的位置!
-
将以下版本设置设置为YES – 也没有帮助
-
将代码覆盖支持启用为YES
-
生成传统的testing覆盖率文件为YES
-
仪器程序stream向YES
-
-
在我的情况下的解决scheme:
为主要目标设置以下构build设置
-
将代码覆盖支持启用为YES
-
生成传统的testing覆盖率文件为YES
-
仪器程序stream向NO
为testing目标(和任何其他目标)设置以下构build设置
-
启用代码覆盖支持到NO
-
生成传统的testing覆盖文件到NO
-
仪器程序stream向NO
希望能帮助到你!
为了解决控制台中“无法合并之前的GCDA文件:损坏的弧标记”消息的问题,避免生成ObjectiveC.gcda文件,通过在目标中将“启用模块(C和Objective-C)”设置为“NO”设置。