代码覆盖率未显示使用 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 的结果的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7 生成 GCOV

gcov代码覆盖率测试-原理和实践总结

为仅标头库获取有用的 GCov 结果

链接时如何解决 __gcov_init 未定义的引用问题

GCOV入门

Xcode 6 代码覆盖率,没有 GDCA 文件“无法打开:没有这样的文件或目录”