2010-11-26 7 views
2

Dans mon application iPhone (XCode 3.2.4, iOS3.1.3), si j'exécute l'application en mode RELEASE, tout va bien, mais en mode DEBUG, le l'application tombe en panne avec une exception EXC_BAD_ACCESS. L'application effectue des calculs complexes. Tout le code principal est contenu dans plusieurs bibliothèques statiques C++ et l'UIApplication crée uniquement un objet à partir de l'une de ces bibliothèques et appelle une méthode de cet objet.Taille de pile des threads secondaires, différences significatives entre les versions DEBUG et RELEASE

Si je mets dans un thread secondaire le code qui appelle les calculs complexes, j'ai toujours le même comportement: Exception EXC_BAD_ACCESS en mode DEBUG et pas de problème en mode RELEASE. Puis j'ai regardé autour de la taille de la pile de threads. Par défaut, iOS définit une taille de pile de thread avec 512 Ko pour les threads secondaires et 1024 Ko pour le thread principal. J'ai regardé la valeur minimale requise pour la taille de la pile de threads pour exécuter correctement mon application. J'ai trouvé le résultat suivant: 40 Kbytes pour la version RELEASE. 1168 Ko pour la version DEBUG. La valeur 1168 kilo-octets dans la version DEBUG explique pourquoi dans le thread principal, l'application va planter (la taille de la pile de défaut pour le thread principal est de 1024 kilo-octets).

Je ne comprends vraiment pas pourquoi la taille de la pile de threads requise est si différente entre les versions RELEASE et DEBUG de mon application (40 KB vs 1168 Kb !!!). Je voudrais de l'aide pour comprendre ce problème.

Merci. Marc

Répondre

1

Il n'est pas inhabituel pour les versions de débogage de code et de bibliothèques de contenir des auto-tests supplémentaires, des variables locales supplémentaires et une vérification. Peut-être que cela augmente les besoins de votre code.

En particulier, il est relativement facile de définir un tampon en tant que variable locale et de prendre de grandes quantités de pile. Vous trouverez peut-être quelque chose comme ça dans un ou plusieurs endroits prenant pile:

#ifdef _DEBUG 
    testBuffer[bufferSize]; 
#endif 

Si « bufferSize » a été définie comme 10K, qui utiliserait jusqu'à 1/4 de l'ensemble de votre pile 40K.

Ou peut-être une fonction de débogage seulement utilise une grande quantité de pile.

Il est également possible que les paramètres de votre version de débogage utilisent un nombre quelconque de paramètres de test d'Apple. Des choses comme MallocStack, GuardMalloc, NSZombiesEnabled nécessiteront plus de mémoire.

Questions connexes