在Xcode 5中启用代码覆盖率运行我的Test目标时,我在构建输出中收到以下几条消息:
profiling:invalid arc tag (0x...)
它们似乎不会影响测试,因为它们成功完成,并且GCDA覆盖文件也按预期生成。
知道消息的含义,或者如何抑制消息/修复问题,因为它们会使构建输出变得混乱,并且很难找到测试用例结果。
答案 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文件与当前结果合并而导致的。
我尝试了什么:
echo"删除.gcda文件"回声 " $ {OBJECT_FILE_DIR_normal} / $ {CURRENT_ARCH}"
注意:ObjectiveC.gcda文件可能位于不同的位置!
将以下构建设置设置为YES - 也没有帮助
启用代码覆盖率支持为是
将旧版测试覆盖率文件生成为“是”
仪器程序流程为YES
我案例中的解决方案:
为主目标设置以下构建设置
启用代码覆盖率支持为是
将旧版测试覆盖率文件生成为“是”
仪器程序流程为否
为测试目标(以及任何其他目标)设置以下构建设置
启用代码覆盖率支持
生成旧版测试覆盖率文件
仪器程序流程为否
希望它有所帮助!
答案 5 :(得分:-2)
要解决在控制台中获取“无法合并以前的GCDA文件:corrupt arc tag”消息的问题,请避免生成ObjectiveC.gcda文件,方法是将“Enable Modules(C and Objective-C)”设置为“NO”,在目标设置中。