Xcode中的条件环境变量

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

NSDebugEnabled NSZombieEnabled MallocStackLogging MallocStackLoggingNoCompact 

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


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

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

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

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

 #include  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。