Iphone Xcode中的条件环境变量

Iphone Xcode中的条件环境变量,iphone,xcode,debugging,ios,Iphone,Xcode,Debugging,Ios,我想在Xcode中创建一些环境变量以进行大量调试,例如: NSDebugEnabled NSZombieEnabled MallocStackLogging MallocStackLoggingNoCompact 是否可以创建一个新的构建配置,它是“Debug”的副本,其中那些环境变量被设置为YES,但我可以切换到常规Debug,而那些将再次关闭 IIRC,环境变量是在“可执行文件”中设置的,而不是在配置/目标中设置的(如果我错了,请忽略此rant)。您可能可以使用Xcode变

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

  NSDebugEnabled
  NSZombieEnabled
  MallocStackLogging
  MallocStackLoggingNoCompact
是否可以创建一个新的构建配置,它是“Debug”的副本,其中那些环境变量被设置为YES,但我可以切换到常规Debug,而那些将再次关闭


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

  • 创建名为“NSDebugEnabled”的布尔生成设置。将NSDebugEnabled环境变量设置为$(NSDebugEnabled)。(它可能必须是一个值为YES的字符串;我不确定NS环境变量有多挑剔。)
  • 创建名为“NSDebugEnabled”的字符串生成设置。将其设置为“NSDebugEnabled”以启用,将其设置为其他内容(空字符串?)以禁用。使用$(NSDebugEnable)作为环境变量名,使用“YES”作为值
如果变量替换不起作用,您可以在main()的最开始调用setenv()/putenv()(在分配自动释放池之前),以在读取变量之前更改环境;这是否成功取决于阅读的时间。IIRC malloc()在您第一次调用malloc()时读取它们(由于Obj-C runtime/+load方法,这可能很早)。我不确定什么时候会读NS*的

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

#包括
内部主(内部argc、字符**argv、字符**envp)
{
#ifdef调试环境
如果(!getenv(“NSDebugEnabled”))
{
setenv(“NSDebugEnabled”,“1”,1);
…设置其他变量。。。
//也许这会抱怨自动释放池。
char*executablePath=[[[NSBundle mainBundle]executablePath]filesystemRepresentation];
execve(executablePath,argv,environ);abort();
}
#恩迪夫
…执行您在main()中通常执行的操作。。。
}
我很确定设备上的沙盒禁止execve()系统调用


如果这些都太多了,我会这么做:

向可执行文件添加一些环境变量。取消选中复选框。需要调试时,选中复选框。调试完成后,取消选中它们。在提交之前,请检查您在.xcodeproj中没有提交任何愚蠢的内容

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


<>你也可以考虑MallocPreScribble和MalLogScript。< / P>嗨,我喜欢最后的选择。你是对的,上面提到的太多了,在脑力杂耍方面要简单得多,只需取消选中这些框。
#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() ...
}