我想在Xcode中创建一些环境,以便进行大量调试,例如:
NSDebugEnabled
NSZombieEnabled
MallocStackLogging
MallocStackLoggingNoCompact
是否有可能创建一个与“Debug”重复的新构建配置,其中这些环境变量设置为YES,但我可以切换到常规Debug,那些会再次关闭?
答案 0 :(得分:0)
IIRC,环境变量在“可执行文件”中设置,而不是配置/目标(如果我错了,请忽略这个咆哮)。您可以使用Xcode变量替换:
如果变量替换不起作用,可能能够在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。