代码覆盖率未显示使用 Xcode + gcov 的结果
Posted
技术标签:
【中文标题】代码覆盖率未显示使用 Xcode + gcov 的结果【英文标题】:Code coverage not showing results using Xcode + gcov 【发布时间】:2011-02-24 06:07:15 【问题描述】:我一直在尝试让代码覆盖率适用于 iPhone 模拟器,并且始终获得 0% 的覆盖率。以下是我尝试过的配置细节和步骤。
配置
Xcode 3.2.5/ios 4.1 和 iOS 4.2/Mac 10.6/GCC 4.2 应用 UICatalog
参考文献
http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/
http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html
步骤
启用“生成测试覆盖文件” 启用“仪器程序流程” 将“-lgcov
”添加到“其他链接器标志”
Info.plist 中的UIApplicationExitsOnSuspend
标志设置为 true
结果
我生成了 .gcda 文件,但覆盖率始终显示为 0%。
已尝试设置
将 GCC 更改为 4.0 和 4.2。当我尝试将 GCC 更改为 4.0 时,出现 26 个构建错误。
设置环境变量
(const char *prefix = "GCOV_PREFIX";
const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory
const char *prefixStrip = "GCOV_PREFIX_STRIP";
const char *prefixStripValue = "1";
setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
GCC 优化设置为无 (-O0) 并取消选中预编译前缀头文件标志。
【问题讨论】:
我们可以为iphone设备做代码覆盖吗?(即不适用于模拟器) 【参考方案1】:感谢有关 stackoverfow 和 CubicleMuses 的所有信息
我的代码覆盖范围适用于模拟器和设备!以下是对我有用的步骤和配置:
配置:Xcode 4!
XCode 项目设置
构建设置
其他链接器标志:添加“-lgcov”
GCC_GENERATE_TEST_COVERAGE_FILES:设置 是的
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS:设置 是的
C/C++ 编译器版本:GCC 4.2(如果您使用的是 XCode 4)iOS 部署目标:4.2 预编译前缀头:否Info.plist
设置 UIApplicationExitsOnSuspend 标志 在你的 Info.plist 中选择 YES上述步骤对于模拟器和设备是相同的,但是,我们需要做一些额外的工作才能使其在设备上运行。
Main.m:复制粘贴下面的代码到main.m
const char *prefix = "GCOV_PREFIX";
const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory
const char *prefixStrip = "GCOV_PREFIX_STRIP";
const char *prefixStripValue = "1";
setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.
注意:确保上面的代码在之前:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
为什么要设置上述覆盖变量?
http://gcc.gnu.org/onlinedocs/gcc/Cross_002dprofiling.html
如何获取 .gcda 文件?
使用 Xcode 中的 Organizer 从设备下载应用程序包,以从 Documents 目录中获取 .gcda 文件。
注意:我无法使用具有相同设置的 Xcode 3.2.5 获得代码覆盖率。但是 Xcode 4 是小菜一碟 :-)
【讨论】:
哇,在头痛 2 周后,我阅读了您的帖子并在大约 5 分钟内完成了工作:) 你是我的英雄,谢谢 即使按照提到的所有步骤,我也无法生成代码覆盖率,因为没有生成 .gcda 文件。我正在为我的 Mac 应用程序设置代码覆盖率。谁有类似的问题?【参考方案2】:感谢 Sangavi,因为您的回答帮助了我。
现在但是: 我一步一步地按照你的描述,然后我遇到了没有创建 gcda 文件(只有 gcdo 文件)的问题。
之后,我删除了您在 main.m 中复制的(上面的)前缀代码,一切都突然起作用了。打赌 gcov-path 没有正确创建或其他什么。
如果有人遇到同样的问题,请发布此内容。
【讨论】:
【参考方案3】:经过数小时的挫折后,我才发现在 Xcode 3.2.6 中启用分布式构建将解决禁用前缀标头的需要。
【讨论】:
【参考方案4】:我遇到了根本没有创建文件的问题。 这是在 Lion 上的 Xcode 4.1 中。
我将编译器从 System Default (GCC 4.2)
更改为 GCC 4.2
。
所以不要使用系统默认值。
看起来像是 Xcode 中的一个错误,但它为我解决了这个问题。 当我改回首选项时,问题又回来了。
【讨论】:
以上是关于代码覆盖率未显示使用 Xcode + gcov 的结果的主要内容,如果未能解决你的问题,请参考以下文章