在我的 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 KB。
DEBUG 版本中的值 1168 KB 解释了为什么在主线程中应用程序会崩溃(主线程的默认堆栈大小为 1024 KB)。
我真的不明白为什么我的应用程序的 RELEASE 版本和 DEBUG 版本之间所需的线程堆栈大小如此不同(40 KB 与 1168 Kb!!!)。我想要任何帮助来理解这个问题。
谢谢。
马克
代码和库的调试版本包含额外的自测试、额外的局部变量和验证并不罕见。也许这些正在增加您的代码的需求。
特别是,将某些缓冲区定义为局部变量并占用大量堆栈是相对容易的。您可能会在一个或多个占用堆栈的地方发现类似的内容:
#ifdef _DEBUG
testBuffer[bufferSize];
#endif
如果“bufferSize”定义为 10K,则将占用整个 40K 堆栈的 1/4。
或者,仅调试函数可能会使用大量堆栈。
您的调试版本的设置也可能使用任意数量的 Apple 测试设置。 MallocStack、GuardMalloc、NSZombiesEnabled 之类的东西将需要更多内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)