Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 次线程的堆栈大小,调试版本和发布版本之间的显著差异_Iphone_Multithreading_Ios - Fatal编程技术网

Iphone 次线程的堆栈大小,调试版本和发布版本之间的显著差异

Iphone 次线程的堆栈大小,调试版本和发布版本之间的显著差异,iphone,multithreading,ios,Iphone,Multithreading,Ios,在我的iPhone应用程序(XCode 3.2.4,iOS3.1.3)中,如果我在发布模式下运行应用程序,一切正常,但在调试模式下,应用程序会崩溃,出现EXC_BAD_访问异常。 该应用程序执行一些复杂的计算。所有的主代码都包含在几个C++静态库中,UIApple只从这些库中创建一个对象,并调用该对象的一个方法。 如果我将调用复杂计算的代码放入辅助线程,我仍然有相同的行为:调试模式下的EXC_BAD_访问异常,而发布模式下没有问题 然后我查看了线程堆栈的大小。默认情况下,iOS将次要线程的线程堆

在我的iPhone应用程序(XCode 3.2.4,iOS3.1.3)中,如果我在发布模式下运行应用程序,一切正常,但在调试模式下,应用程序会崩溃,出现EXC_BAD_访问异常。 该应用程序执行一些复杂的计算。所有的主代码都包含在几个C++静态库中,UIApple只从这些库中创建一个对象,并调用该对象的一个方法。 如果我将调用复杂计算的代码放入辅助线程,我仍然有相同的行为:调试模式下的EXC_BAD_访问异常,而发布模式下没有问题

然后我查看了线程堆栈的大小。默认情况下,iOS将次要线程的线程堆栈大小设置为512 KB,主线程的线程堆栈大小设置为1024 KB。 我已经找到了线程堆栈大小正确运行应用程序所需的最小值。 我发现了以下结果: 发布版本为40 KB。 调试版本为1168 KB

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

我真的不明白为什么我的应用程序的发行版和调试版之间所需的线程堆栈大小如此不同(40KB对1168 KB!!!)。我想要任何帮助来理解这个问题

多谢各位。
Marc

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

特别是,将一些缓冲区定义为局部变量并占用大量堆栈相对容易。您可能会在一个或多个占据堆栈的位置发现类似的内容:

#ifdef _DEBUG
   testBuffer[bufferSize]; 
#endif
如果将“bufferSize”定义为10K,则会占用整个40K堆栈的1/4

或者,一个只进行调试的函数可能会使用大量堆栈

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