前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >尝试解决 Xcode7.1 覆盖率测试 GCDA 文件损坏问题

尝试解决 Xcode7.1 覆盖率测试 GCDA 文件损坏问题

作者头像
刘笑江
发布2018-05-28 11:32:28
1.7K0
发布2018-05-28 11:32:28
举报
文章被收录于专栏:刘笑江的专栏

在升级到 Xcode7 后,项目遇到覆盖率测试输出的 GCDA 文件损坏问题。

覆盖率测试原理

  1. 在 App 运行时调用__gcov_flush() 输出 GCDA 文件, 记录每行代码的执行次数。
  2. 然后用 lcov 命令从 CGDA + GCOV 生成报告文件,可以看到运行过程中每行代码的执行次数。

问题表现

  1. 终端输出信息后 crash:

1

profiling: /Users/username/Library/Developer/CoreSimulator/Devices/DEVICE_ID/data/Containers/Data/Application/APP_ID/Documents/CoverageTest/CoreGraphics.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000011)

  1. lcov 命令从 GCDA 文件恢复的代码执行次数数据为0。而同样的代码用 Xcode6 得到的 GCDA 文件则没有问题。

问题定位

搜到很多人讨论,尝试文中提到的方法均无效,怀疑是 Xcode7 bug:生成 GCDA 文件的 __gcov_flush() 函数的问题。

https://forums.developer.apple.com/thread/9765 https://github.com/specta/specta/issues/167 http://stackoverflow.com/questions/22519530/dozens-of-profilinginvalid-arc-tag-when-running-code-coverage-in-xcode-5 https://twitter.com/orta/status/595599325675171840

问题解决

由于这个函数在 llvm runtime library 中,较难定位debug,故找到其llvm compiler-rt 开源代码,导入Xcode项目中: GCDAProfiling.c / InstrProfiling.c / InstrProfiling.h

将调用__gcov_flush()的文件声明 extern void __gcov_flush() 改成 #import “GCDAProfiling.c”,就可以自行 debug 了。

问题1:crash of cannot merge previous GCDA file: corrupt arc

12345678910

void llvm_gcda_start_file(const char *orig_filename, const char version[4], uint32_t checksum) { const char *mode = "r+b"; filename = mangle_filename(orig_filename); // fix : cannot merge previous GCDA file: corrupt arc tag char *skipFileNames[2] = {"QuartzCore.gcda", "CoreGraphics.gcda"}; for (int i = 0; i < 2; i++) { if (strstr(filename, skipFileNames[i])) return; } ....

问题2: GCDA 恢复得到计数为0

gcda计数为0 定位到这里,原因是uint64_t 累加溢出了,导致计数为0。加一个溢出保护。

gcda fix 2
gcda fix 2

未来工作

GCDA 恢复数据虽然有了,基本满足测试组的需求(有没有覆盖到),但是不是完全正确的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 覆盖率测试原理
  • 问题表现
  • 问题定位
  • 问题解决
    • 问题1:crash of cannot merge previous GCDA file: corrupt arc
      • 问题2: GCDA 恢复得到计数为0
      • 未来工作
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档