带有GCDA文件的Xcode 7代码覆盖乱丢项目目录

时间:2015-10-30 19:46:24

标签: objective-c xcode macos code-coverage xcode7

在重构我的Swift代码2.0并修复所有各种新的编译器警告和错误之后,我第一次在Xcode 7中运行我的单元测试。我看到了一些不同的行为,这些行为可能都是相关的。

  1. 当单元测试结束时,我得到一个gcda文件,我链接的每个系统框架都被转储到我的项目根目录(例如QuartzCore.gcdaCoreData.gcda
  2. 我得到了以下错误的长列表:
      

    < project root> /CoreGraphics.gcda:无法合并以前的GCDA文件:corrupt arc tag(0x00000017)

  3. 最后,我得到一个EXC_BAD_ACCESS异常抛出,带有这个堆栈跟踪:

    #0  0x0000000105cf06b4 in llvm_gcda_emit_function ()
    #1  0x0000000105845c0a in __llvm_gcov_writeout ()
    #2  0x0000000105cf18e4 in llvm_writeout_files ()
    #3  0x00007fff9641271b in __cxa_finalize_ranges ()
    #4  0x00007fff96412a30 in exit ()
    #5  0x0000000100056e9f in ___XCTestMain_block_invoke ()
    #6  0x000000010000e7c9 in -[XCTestDriver _runSuite] ()
    #7  0x000000010000f31a in -[XCTestDriver _checkForTestManager] ()
    #8  0x0000000100056c69 in _XCTestMain ()
    #9  0x0000000100001dc9 in ___lldb_unnamed_function3$$xctest ()
    #10 0x00007fff9098d5c9 in start ()
    #11 0x00007fff9098d5c9 in start ()
    
  4. 我已启用启用代码覆盖率支持生成旧版测试覆盖率文件,但我尝试切换后者并没有任何区别。我在OS X 10.10.5上使用Xcode 7.1。

    启用收集覆盖数据,方案似乎已修复#3 ,但之后又回来了。

1 个答案:

答案 0 :(得分:0)

在Xcode 7.1.1中,它可能是__gcov_flush()的错误。我把它挂钩并修复如下:

  1. 在调用__gcov_flush()的文件中,将extern void __gcov_flush(void);替换为#import “GCDAProfiling.h”

  2. 然后将此文件拖至您的Xcode项目:GCDAProfiling.cGCDAProfiling.hInstrProfilingUtil.cInstrProfilingUtil.h来自https://github.com/liuslevis/GCDACorruptionFix

  3. 构建并运行。

  4. 我将函数skip_special_file()adding overflow protection添加到文件GCDAProfiling.c。 Xcode不再崩溃,并且来自lgcov文件的命令.gcda恢复的代码行的计数似乎不为零。

    参考:http://davidlau.me/2015/12/05/Trying-to-fix-Xcode-7-GDCA-file-corruption/