辅助线程的堆栈大小,DEBUG和RELEASE版本之间的显着差异

时间:2010-11-26 14:54:51

标签: iphone multithreading ios

在我的iPhone应用程序(XCode 3.2.4,iOS3.1.3)中,如果我在RELEASE模式下运行应用程序,一切都很好,但在DEBUG模式下,应用程序崩溃并出现EXC_BAD_ACCESS异常。 该应用程序执行一些复杂的计算所有主要代码都包含在几个C ++静态库中,UIApplication只从这些库中的一个创建一个对象,并调用该对象的方法。

如果我将调用复杂计算的代码放入辅助线程,我仍然有相同的行为:在DEBUG模式下EXC_BAD_ACCESS异常,在RELEASE模式下没有问题。

然后我查看了线程堆栈大小。默认情况下,iOS为主线程设置一个线程堆栈大小,其中辅助线程为512 KB,主线程为1024 KB。 我已经查看了线程堆栈大小所需的最小值,以便正确运行我的应用程序。 我发现了以下结果: RELEASE版本为40 KB。 DEBUG版本为1168千字节。

DEBUG版本中的值1168 Kbytes解释了为什么在主线程中,应用程序将崩溃(主线程的defaut堆栈大小为1024 KB)。

我真的不明白为什么我的应用程序的RELEASE和DEBUG版本之间所需的线程堆栈大小如此不同(40 KB vs 1168 Kb !!!)。我希望有任何帮助来理解这个问题。

谢谢。 马克

1 个答案:

答案 0 :(得分:1)

代码和库的调试版本包含额外的自测试,额外的局部变量和验证并不罕见。也许这些增加了代码的需求。

特别是,将一些缓冲区定义为局部变量并占用大量堆栈相对容易。你可能会在一个或多个占用堆栈的地方找到这样的东西:

#ifdef _DEBUG
   testBuffer[bufferSize]; 
#endif

如果'bufferSize'被定义为10K,则会占用整个40K堆栈的1/4。

或许只有调试的函数会使用大量的堆栈。

也可能是调试版本的设置使用了任意数量的Apple测试设置。像MallocStack,GuardMalloc,NSZombiesEnabled这样的东西需要更多的内存。