Xcode中的条件环境变量

时间:2010-09-28 19:02:02

标签: iphone xcode debugging ios

我想在Xcode中创建一些环境,以便进行大量调试,例如:

  NSDebugEnabled
  NSZombieEnabled
  MallocStackLogging
  MallocStackLoggingNoCompact

是否有可能创建一个与“Debug”重复的新构建配置,其中这些环境变量设置为YES,但我可以切换到常规Debug,那些会再次关闭?


1 个答案:

答案 0 :(得分:0)

IIRC,环境变量在“可执行文件”中设置,而不是配置/目标(如果我错了,请忽略这个咆哮)。您可以使用Xcode变量替换:

  • 创建一个名为“NSDebugEnabled”的布尔构建设置。将NSDebugEnabled环境变量设置为$(NSDebugEnabled)。 (它可能必须是值为YES的字符串;我不确定NS环境变量有多挑剔。)
  • 创建名为“NSDebugEnabled”的字符串构建设置。将其设置为“NSDebugEnabled”以启用和其他(空字符串?)禁用。使用$(NSDebugEnable)作为环境变量名称,使用“YES”作为值。

如果变量替换不起作用,可能能够在main()的最开始(在分配自动释放池之前)调用setenv()/ putenv()来改变环境在读取变量之前;这是否成功取决于他们何时阅读。 IIRC malloc()在您第一次调用malloc()时读取它们(由于Obj-C运行时/ +加载方法,这可能很早)。我不确定何时会阅读NS *。

如果仍然无效,并且您很高兴在模拟器中运行,我认为您可以使用execve():

#include <unistd.h>

int main (int argc, char ** argv, char ** envp)
{
#ifdef DEBUGENVIRON
  if (!getenv("NSDebugEnabled"))
  {
    setenv("NSDebugEnabled","1",1);
    ... set the other variables ...
    // Maybe this will complain about an autorelease pool.
    char * executablePath = [[[NSBundle mainBundle] executablePath] filesystemRepresentation];
    execve(executablePath, argv, environ); abort();
  }
#endif
  ... do what you normally do in main() ...
}

我很确定在设备上使用沙盒禁止execve()系统调用。


如果这一切都太多了,这就是我的所作所为:

将一些环境变量添加到可执行文件中。取消选中该复选框。需要调试时,选中复选框。调试完成后,取消选中它们。在提交之前,请检查您是否在.xcodeproj中犯了任何愚蠢的行为。

如果您使用泄漏,我认为您不需要MallocStackLogging(泄漏应自动设置)。

您可能还会考虑使用MallocPreScribble和MallocScribble。