堆栈大小的次要线程,DEBUG和RELEASE版本之间的重大差异

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

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

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

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

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

谢谢。 渣子

代码和库的debugging版本包含额外的自我testing,额外的本地variables和validation并不罕见。 也许这些正在增加您的代码的需求。

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

#ifdef _DEBUG testBuffer[bufferSize]; #endif 

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

或者也许一个debuggingfunction使用大量的堆栈。

也可能是您的debugging版本的设置使用任何数量的苹果的testing设置。 像MallocStack,GuardMalloc,NSZombiesEnabled的事情将需要更多的内存。