如何在iPhone上为gcov设置环境变量

时间:2010-06-16 00:00:16

标签: iphone code-coverage gcov coverstory

我已经克服了在我的iPhone项目中设置gcov的所有问题,但现在我得到以下内容:

profiling:/Users:Cannot create directory

有没有人对我可能做错了什么有任何建议?

我最初按照Google的说明设置了gcov,可以通过Google搜索“UsingCoverStory”找到

更新: 好的,让我澄清一下我要做的事情。我有一个iPhone应用程序,我试图自动测试。我正在使用UISpec框架来驱动GUI。我真正知道的是我实际用测试覆盖了多少代码。我认为我非常接近,但我只需要了解如何正确设置环境/编译器变量以适应我的项目。

以下是我到目前为止所做的总结。我首先复制了我的构建目标,指定了链接器标志和规定的其他几个选项。 (这可以使用Google创建的AppleScript自动完成。可以通过Google搜索“UsingCoverStory”找到说明和下载)无论如何,我已经确认这些设置是正确分配的。我将配置设置为Debug,我在3.1.3设备上运行它。当我运行应用程序时,它在调试器中没有显示任何特殊内容,直到我退出应用程序。那时我得到一个错误:

profiling:/Users:Cannot create directory
profiling:/Users/forbushbl/Documents/TestApp/build/TestApp.build/Debug-iphoneos/TestApp copy.build/Objects-normal/armv6/ApplicationController.gcda:Skip

我认为GCOV正试图写出.gcda文件,但我不太清楚如何告诉它应该写在哪里。我在某处读到GCOV尝试重现.gcno文件存储在我的项目文件夹中的目录结构,这是有意义的,因为上面的目录是.gcno文件所在的位置我的机器。然而,这是一个问题,因为iPhone上不存在该结构,设备也不能创建该结构。

我找到了另一个有同样问题的人,他们说他们必须设置一个环境变量。 How to set up gcov for code coverage analysis in iPhone SDK?

GCOV文档说明如下:

  

例如,如果构建了目标文件/user/build/foo.o   -fprofile-arcs,最终的可执行文件将在目标系统上运行时尝试创建数据文件/user/build/foo.gcda。这将失败   如果相应的目录不存在且无法访问   创造它。这可以通过例如设置来克服   环境为“GCOV_PREFIX = / target / run”和“GCOV_PREFIX_STRIP = 1”。   此类设置将命名数据文件/target/run/build/foo.gcda

我的问题是,如何在iPhone上设置这些环境变量?我应该在构建配置中还是在实际代码中执行此操作?

2 个答案:

答案 0 :(得分:1)

您应该在项目的main.m文件中使用setenv设置这些变量:

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;

答案 1 :(得分:0)

您应该能够在可执行设置中设置这些环境变量。打开项目的“可执行文件”分支(在树/公开视图中),然后双击可执行文件。在参数窗格下,您可以设置环境变量。