使用Xcode和gcov时,代码覆盖率未显示结果

13
我一直在尝试让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%。

尝试的设置

  1. Changing GCC to 4.0 and 4.2. When I try to change the GCC to 4.0 I get 26 build errors.

  2. Set environment variables

    (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.)
    
  3. GCC Optimization set to None (-O0) and unchecked the precompiled prefix header file flag.


我们能为iPhone设备进行代码覆盖率测试吗?(即不针对模拟器) - GameLoading
4个回答

19

感谢stackoverflow和CubicleMuses提供的所有信息。

我已经使代码覆盖率在模拟器和设备上都能工作!以下是对我有效的步骤和配置:

配置:Xcode 4!

XCode项目设置

构建设置

  • 其他链接器标志:“-lgcov”

  • GCC_GENERATE_TEST_COVERAGE_FILES:设置为YES

  • GCC_INSTRUMENT_PROGRAM_FLOW_ARCS:设置为YES

  • C/C++编译器版本:GCC 4.2(如果您使用的是XCode 4),iOS部署目标:4.2
  • 预编译前缀标头:NO

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)从设备下载应用程序包,从文档目录中获取.gcda文件。
注意:我无法在Xcode 3.2.5中使用相同的设置获得代码覆盖率。但Xcode 4很容易实现 :-)

哇,头痛了两个星期后我读了你的帖子,只花了大约5分钟就搞定了 :) 你是我的英雄,谢谢。 - aryaxt
即使按照所有提到的步骤操作,我仍然无法生成代码覆盖率,因为没有生成.gcda文件。我正在为我的Mac应用程序设置代码覆盖率。有人遇到类似的问题吗? - Kiran Balegar

2

感谢Sangavi,因为你的回答帮助了我。

但是有个问题: 我按照你的描述一步一步做,然后出现了这样的问题:没有生成gcda文件(只有gcdo文件)。

之后我删除了你上面提到的前缀代码,这些代码我复制到了main.m中,然后一切突然就好了。可能是gcov路径没有正确创建或者其他原因。

如果有人遇到同样的问题,我在这里发一下。


1
我刚刚在经历了数小时的挫败后发现,在Xcode 3.2.6中启用分布式构建将解决禁用前缀头文件的需求。

0

我遇到了一个问题,就是根本没有创建任何文件。 这是在Lion上的Xcode 4.1。

我将编译器从System Default (GCC 4.2)更改为GCC 4.2。 所以不要使用系统默认值。

看起来像是Xcode的一个bug,但这对我解决了问题。
当我改回首选项时,问题又出现了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接