【问题标题】:How to setup environment variables for gcov on iPhone如何在 iPhone 上为 gcov 设置环境变量
【发布时间】:2011-03-04 06:09:09
【问题描述】:

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

profiling:/Users:Cannot create directory

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

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

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

这是我迄今为止所做的总结。我首先复制了我的构建目标,指定了链接器标志和规定的其他几个选项。 (这可以使用 Google 创建的 AppleScript 自动完成。说明和下载可以通过谷歌搜索“UsingCoverStory”找到)无论如何,我已经验证这些设置分配正确。我将我的配置设置为调试,我在 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 上设置这些环境变量?我应该在构建配置中还是在实际代码中执行此操作?

【问题讨论】:

标签: iphone code-coverage gcov coverstory


【解决方案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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 2022-07-01
      • 1970-01-01
      • 2011-02-13
      • 2018-09-25
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多